[iOS] tableView中實現底部button出現時tableView的bottom自動向上偏移

這是我在工程中遇到的一個需求:選擇照片以後,按bottomButton進行發送。ide

具體場景:照片存放在tableviewcontroller中,當選擇照片以後,自動彈出bottomButton,點擊以後發送照片;當取消全部的照片以後該button自動消失。函數

問題:該button會遮擋底部的照片,因此須要實現當底部的button出現時tableView的bottom自動向上偏移的功能。atom

  我用autoLayout和contentOffset來解決這個問題的,在一開始就建立這兩個view(tableview 和bottomButton),經過控制NSLayoutConstant的constant來控制該button的出現,省去了hidden = YES/NO;下面經過代碼進行分析:orm

- (void)setupUIthree

{ip

  [self createPhotoView];animation

  [self sendButtonView];it

  // auto layoutio

  self.assetsViewController.view.translatesAutoresizingMaskIntoConstraints = NO;table

  self.sendButtonView.translatesAutoresizingMaskIntoConstraints = NO;

  NSDictionary *viewsDict = @{@"assetsView": self.assetsViewController.view,

                             @"sendBtnView": self.sendButtonView};

  [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[assetsView]-0-|" options:0 metrics:nil views:viewsDict]];

  [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[sendBtnView]-0-|" options:0 metrics:nil views:viewsDict]];

  [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0-[assetsView]-0-[sendBtnView]-0-|" options:0 metrics:nil views:viewsDict]];

  self.sendBtnHeightLayoutConstraint = [NSLayoutConstraint constraintWithItem:self.sendButtonView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeHeight multiplier:1.0f constant:0];

  [self.view addConstraint:self.sendBtnHeightLayoutConstraint];

}

這部分控制了該button的水平和垂直方向,主要是垂直方向的控制。關鍵是 self.sendBtnHeightLayoutConstraint變量比較巧妙,這是我以前申請的一個屬性:

@property (nonatomic, strong) NSLayoutConstraint *sendBtnHeightLayoutConstraint;

而 self.sendBtnHeightLayoutConstraint = [NSLayoutConstraint constraintWithItem:self.sendButtonView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeHeight multiplier:1.0f constant:0];實際經過對該變量進行賦值以控制其隱藏或出現,下面會繼續分析。

 

接着是顯示button的函數:

- (void)updateBottomButton:(NSInteger)selectedItemCount

{

 // use animation 

  [UIView animateWithDuration:0.5f animations:^{

    if (0 >= selectedItemCount) {//hide

      self.sendBtnHeightLayoutConstraint.constant = 0;

      self.tableViewAdjustOffsetY = 0.0;

    } else { //show

      self.sendBtnHeightLayoutConstraint.constant = kHeightForSendButton;

     // three conditions

      BOOL isMoreThanOnePage = self.assetsViewController.tableView.contentSize.height > self.assetsViewController.tableView.frameHeight;

      BOOL isInLastPage = self.assetsViewController.tableView.contentOffset.y > self.assetsViewController.tableView.contentSize.height - self.assetsViewController.tableView.frameHeight;

      BOOL hasAdjustedOffsetY = self.assetsViewController.tableView.contentOffset.y == self.tableViewAdjustOffsetY;

      if (isMoreThanOnePage && isInLastPage && !hasAdjustedOffsetY) {

        self.tableViewAdjustOffsetY = self.assetsViewController.tableView.contentOffset.y + kHeightForSendButton;

        self.assetsViewController.tableView.contentOffset = CGPointMake(self.assetsViewController.tableView.contentOffset.x, self.tableViewAdjustOffsetY);

      }

    }

    [self.view layoutIfNeeded];

  } completion:^(BOOL finished) {

  }];

其中self.sendBtnHeightLayoutConstraint.constant = 0;將該button進行隱藏,這個用法比較巧妙,由於前面已經 [self.view addConstraint:self.sendBtnHeightLayoutConstraint];因此這裏的改變直接影響到self.view,但前提是要調用[self.view layoutIfNeeded];

在show的分支中, self.sendBtnHeightLayoutConstraint.constant = kHeightForSendButton;進行顯示。

 

接着是contentOffset的控制,以前的3個condition很容易考慮不全。isInLastPage:由於咱們須要在最後一頁移動tableview的bottom;isMoreThanOnePage:而且若是隻有一頁的話咱們不須要進行操做;!hasAdjustedOffsetY:在連續選擇時只在第一次時移動。

最後有個問題,爲啥show的適合須要調整contentOffset,hide的時候不須要呢?彷佛也很簡單,聰明的你應該已經知道答案了吧!

相關文章
相關標籤/搜索