[iOS] tableView中实现底部button出现时tableView的bottom自动向上偏移
这是我在工程中遇到的一个需求:选择照片之后,按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自动向上偏移相关推荐
- 函数域中申请堆空间出函数后不会自动释放
#include<iostream> using std::cout; using std::endl; char *scat(char *s1,char *s2) { char *s= ...
- UITableView (4): 在TableView中移动cell和Section 从TableView中删除cell和section 添加系统默认刷新控件...
一 .问题:你想用流畅直观的动画来移动和拖拽TableView中的cell和section 方案: 用moveSection:toSection:方法把一个Section移动到新位置. 用moveR ...
- android中底部弹窗,Android实现从底部弹出的Dialog示例(一)
一.概述 先给大家看一下效果图: 点击中间的显示弹框按钮,从底部弹出来一个对话框,用户可以点击拍照或者从相册选择进行相应的操作,下面看看怎么实现. 二.代码实现 主页面布局文件,很简单,一个按钮,响应 ...
- iOS项目中一定会用到的两种常用的弹框 从底部弹出 、中间弹出 Swift代码
从底部弹出的弹框 ,样式如下 1.利用CocoaPods导入HWPanModal 框架,在桥接文件中导入头文件 #import "HWPanModal.h" 2.创建一个新的控制器 ...
- Android仿IOS封装通用的弹出框Dialog和底部弹出列表选择框 仿美团顶部条件筛选框 附自定义ViewGroup
弹出框 背景 提示与询问弹出框 实现 使用 列表选择框 实现 使用 顶部条件筛选框 实现 自定义ViewGroup 使用 总结 背景 鉴于Android提供的默认弹出框很一般,IOS的弹出框样式还不错 ...
- Android中BottomSheetDialog使用方法(底部弹出的Dialog)
大家都知道IOS的很多菜单都是从底部弹出的,这种展示方式还是很好看的,而丑爆的Android默认弹框一直都是大家一定要摒弃的,那么我们Android如何做出相应效果的弹框.下面我们就介绍这种做法. 底 ...
- iOS 11中tableView下移问题
本文主要是对iOS 11下APP中tableView内容下移20pt或下移64pt的问题适配的一个总结.内容包括五个部分:问题的原因分析.adjustContentInset属性的计算方式.什么情况下 ...
- iOS下Html页面中input获取焦点弹出键盘时挡住input解决方案
iOS下Html页面中input获取焦点弹出键盘时挡住input解决方案 参考文章: (1)iOS下Html页面中input获取焦点弹出键盘时挡住input解决方案 (2)https://www.cn ...
- iOS下Html页面中input获取焦点弹出键盘时挡住input解决方案—scrollIntoView()
iOS下Html页面中input获取焦点弹出键盘时挡住input解决方案-scrollIntoView() 参考文章: (1)iOS下Html页面中input获取焦点弹出键盘时挡住input解决方案- ...
最新文章
- 配置nfs服务器出现的问题
- 我说分布式事务之最大努力通知型事务
- android studio 配置国内镜像
- 管理全局包、缓存和临时文件夹
- Centos6.X安装smokeping
- Linux性能优化实战:应用的CPU使用率100%,我该怎么办(05)
- win7服务器 能否建立多个网站,windows7下weblogic10.3服务器下一个domain建多个server(端口)...
- linux mc服务器 mod_我的世界:mc有哪些不为人知的“内幕”?Hypixel停服事件的真相...
- LeetCode——Maximum Depth of Binary Tree
- 重磅!苹果正式开源iOS内核源码!
- 拓端tecdat|R语言中使用线性模型、回归决策树自动组合特征因子水平
- win10pe命令打开计算机,Win10是怎么进入安全模式
- java堆栈类_JAVA 堆栈类(Stack)的使用
- 画图清空画布,怎样将Word中会出现的绘图画布删除掉?
- 计算机记账的优点,记账凭证的优缺点
- linux课程设计 点菜,餐馆点餐系统专业课程设计.doc
- Oracle在中国的裁员暗示了中国的云服务市场什么?
- CNS积分 全国首款基于商品交易应用场景的区块链产品
- signalr收不到服务器的信息,c# – SignalR .NET客户端无法接收消息
- @SuppressLint(NewApi)
热门文章
- python小学生口算题生成器_小学数学题出题神器
- mysql.createpool_Node.js MySQL模块中mysql.createConnection和mysql.createPool有什么区别?
- dsp调音一次多少钱_DSP调音中EQ使用技巧
- print writer保留原有信息写文件_Python读写EXCEL文件常用方法大全 - pythonputao
- ttf_openfont可以多次调用吗_【译文】Rust futures: async fn中的thread::sleep和阻塞调用...
- RabbitMQ和Kafka的区别
- 计算机与人力资源管理论文,计算机专业毕业论文-人力资源管理系统的研究与实现...
- linux执行class文件_深入理解linux内核——可执行文件执行过程(2)
- mysql 格林时间转换_格林时间转换成正常时间
- mysql+多列外键_MySQL中的多列外键?