这是我在工程中遇到的一个需求:选择照片之后,按bottomButton进行发送。

具体场景:照片存放在tableviewcontroller中,当选择照片之后,自动弹出bottomButton,点击之后发送照片;当取消所有的照片之后该button自动消失。

问题:该button会遮挡底部的照片,所以需要实现当底部的button出现时tableView的bottom自动向上偏移的功能。

我用autoLayout和contentOffset来解决这个问题的,在一开始就创建这两个view(tableview 和bottomButton),通过控制NSLayoutConstant的constant来控制该button的出现,省去了hidden = YES/NO;下面通过代码进行分析:

- (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的水平和垂直方向,主要是垂直方向的控制。关键是 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的时候不需要呢?似乎也很简单,聪明的你应该已经知道答案了吧!

转载于:https://www.cnblogs.com/sweet-coffee/p/4934156.html

[iOS] tableView中实现底部button出现时tableView的bottom自动向上偏移相关推荐

  1. 函数域中申请堆空间出函数后不会自动释放

    #include<iostream> using std::cout; using std::endl; char *scat(char *s1,char *s2) {  char *s= ...

  2. UITableView (4): 在TableView中移动cell和Section 从TableView中删除cell和section 添加系统默认刷新控件...

    一  .问题:你想用流畅直观的动画来移动和拖拽TableView中的cell和section 方案: 用moveSection:toSection:方法把一个Section移动到新位置. 用moveR ...

  3. android中底部弹窗,Android实现从底部弹出的Dialog示例(一)

    一.概述 先给大家看一下效果图: 点击中间的显示弹框按钮,从底部弹出来一个对话框,用户可以点击拍照或者从相册选择进行相应的操作,下面看看怎么实现. 二.代码实现 主页面布局文件,很简单,一个按钮,响应 ...

  4. iOS项目中一定会用到的两种常用的弹框 从底部弹出 、中间弹出 Swift代码

    从底部弹出的弹框 ,样式如下 1.利用CocoaPods导入HWPanModal 框架,在桥接文件中导入头文件 #import "HWPanModal.h" 2.创建一个新的控制器 ...

  5. Android仿IOS封装通用的弹出框Dialog和底部弹出列表选择框 仿美团顶部条件筛选框 附自定义ViewGroup

    弹出框 背景 提示与询问弹出框 实现 使用 列表选择框 实现 使用 顶部条件筛选框 实现 自定义ViewGroup 使用 总结 背景 鉴于Android提供的默认弹出框很一般,IOS的弹出框样式还不错 ...

  6. Android中BottomSheetDialog使用方法(底部弹出的Dialog)

    大家都知道IOS的很多菜单都是从底部弹出的,这种展示方式还是很好看的,而丑爆的Android默认弹框一直都是大家一定要摒弃的,那么我们Android如何做出相应效果的弹框.下面我们就介绍这种做法. 底 ...

  7. iOS 11中tableView下移问题

    本文主要是对iOS 11下APP中tableView内容下移20pt或下移64pt的问题适配的一个总结.内容包括五个部分:问题的原因分析.adjustContentInset属性的计算方式.什么情况下 ...

  8. iOS下Html页面中input获取焦点弹出键盘时挡住input解决方案

    iOS下Html页面中input获取焦点弹出键盘时挡住input解决方案 参考文章: (1)iOS下Html页面中input获取焦点弹出键盘时挡住input解决方案 (2)https://www.cn ...

  9. iOS下Html页面中input获取焦点弹出键盘时挡住input解决方案—scrollIntoView()

    iOS下Html页面中input获取焦点弹出键盘时挡住input解决方案-scrollIntoView() 参考文章: (1)iOS下Html页面中input获取焦点弹出键盘时挡住input解决方案- ...

最新文章

  1. 配置nfs服务器出现的问题
  2. 我说分布式事务之最大努力通知型事务
  3. android studio 配置国内镜像
  4. 管理全局包、缓存和临时文件夹
  5. Centos6.X安装smokeping
  6. Linux性能优化实战:应用的CPU使用率100%,我该怎么办(05)
  7. win7服务器 能否建立多个网站,windows7下weblogic10.3服务器下一个domain建多个server(端口)...
  8. linux mc服务器 mod_我的世界:mc有哪些不为人知的“内幕”?Hypixel停服事件的真相...
  9. LeetCode——Maximum Depth of Binary Tree
  10. 重磅!苹果正式开源iOS内核源码!
  11. 拓端tecdat|R语言中使用线性模型、回归决策树自动组合特征因子水平
  12. win10pe命令打开计算机,Win10是怎么进入安全模式
  13. java堆栈类_JAVA 堆栈类(Stack)的使用
  14. 画图清空画布,怎样将Word中会出现的绘图画布删除掉?
  15. 计算机记账的优点,记账凭证的优缺点
  16. linux课程设计 点菜,餐馆点餐系统专业课程设计.doc
  17. Oracle在中国的裁员暗示了中国的云服务市场什么?
  18. CNS积分 全国首款基于商品交易应用场景的区块链产品
  19. signalr收不到服务器的信息,c# – SignalR .NET客户端无法接收消息
  20. @SuppressLint(NewApi)

热门文章

  1. python小学生口算题生成器_小学数学题出题神器
  2. mysql.createpool_Node.js MySQL模块中mysql.createConnection和mysql.createPool有什么区别?
  3. dsp调音一次多少钱_DSP调音中EQ使用技巧
  4. print writer保留原有信息写文件_Python读写EXCEL文件常用方法大全 - pythonputao
  5. ttf_openfont可以多次调用吗_【译文】Rust futures: async fn中的thread::sleep和阻塞调用...
  6. RabbitMQ和Kafka的区别
  7. 计算机与人力资源管理论文,计算机专业毕业论文-人力资源管理系统的研究与实现...
  8. linux执行class文件_深入理解linux内核——可执行文件执行过程(2)
  9. mysql 格林时间转换_格林时间转换成正常时间
  10. mysql+多列外键_MySQL中的多列外键?