[iOS] tableView中实现底部button出现时tableView的bottom自动向上偏移
這是我在工程中遇到的一個(gè)需求:選擇照片之后,按bottomButton進(jìn)行發(fā)送。
具體場(chǎng)景:照片存放在tableviewcontroller中,當(dāng)選擇照片之后,自動(dòng)彈出bottomButton,點(diǎn)擊之后發(fā)送照片;當(dāng)取消所有的照片之后該button自動(dòng)消失。
問題:該button會(huì)遮擋底部的照片,所以需要實(shí)現(xiàn)當(dāng)?shù)撞康腷utton出現(xiàn)時(shí)tableView的bottom自動(dòng)向上偏移的功能。
? 我用autoLayout和contentOffset來(lái)解決這個(gè)問題的,在一開始就創(chuàng)建這兩個(gè)view(tableview 和bottomButton),通過(guò)控制NSLayoutConstant的constant來(lái)控制該button的出現(xiàn),省去了hidden = YES/NO;下面通過(guò)代碼進(jìn)行分析:
- (void)setupUI
{
? [self createPhotoView];
? [self sendButtonView];
? // auto layout
? self.assetsViewController.view.translatesAutoresizingMaskIntoConstraints = NO;
? 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的水平和垂直方向,主要是垂直方向的控制。關(guān)鍵是?self.sendBtnHeightLayoutConstraint變量比較巧妙,這是我之前申請(qǐng)的一個(gè)屬性:
@property (nonatomic, strong) NSLayoutConstraint *sendBtnHeightLayoutConstraint;
而?self.sendBtnHeightLayoutConstraint = [NSLayoutConstraint constraintWithItem:self.sendButtonView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeHeight multiplier:1.0f constant:0];實(shí)際通過(guò)對(duì)該變量進(jìn)行賦值以控制其隱藏或出現(xiàn),下面會(huì)繼續(xù)分析。
?
接著是顯示button的函數(shù):
- (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進(jìn)行隱藏,這個(gè)用法比較巧妙,因?yàn)榍懊嬉呀?jīng)?[self.view addConstraint:self.sendBtnHeightLayoutConstraint];所以這里的改變直接影響到self.view,但前提是要調(diào)用[self.view layoutIfNeeded];
在show的分支中,?self.sendBtnHeightLayoutConstraint.constant = kHeightForSendButton;進(jìn)行顯示。
?
接著是contentOffset的控制,之前的3個(gè)condition很容易考慮不全。isInLastPage:因?yàn)槲覀冃枰谧詈笠豁?yè)移動(dòng)tableview的bottom;isMoreThanOnePage:并且如果只有一頁(yè)的話我們不需要進(jìn)行操作;!hasAdjustedOffsetY:在連續(xù)選擇時(shí)只在第一次時(shí)移動(dòng)。
最后有個(gè)問題,為啥show的適合需要調(diào)整contentOffset,hide的時(shí)候不需要呢?似乎也很簡(jiǎn)單,聰明的你應(yīng)該已經(jīng)知道答案了吧!
轉(zhuǎn)載于:https://www.cnblogs.com/sweet-coffee/p/4934156.html
總結(jié)
以上是生活随笔為你收集整理的[iOS] tableView中实现底部button出现时tableView的bottom自动向上偏移的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [原][歌曲]感动的歌曲排序
- 下一篇: P4313 文理分科 网络流