众所周知我们大家在开发中,可能会有一些页面显示的元素很多,可能会超出一个屏幕,但也不适合用TableView或者CollectionView,此时我们一般会用滚动视图,那么就会出现自动布局的问题。下面话不多说了,来一起看看详细的介绍吧。
纯代码
-
<李>特点编码繁琐:需要手写控件李>
<李>安全:只要正确地设置约束或者,contentSize,一般不会出现滚动问题李>
示例
懒惰的var滚动视图:UIScrollView={ 让obj=UIScrollView(框架:CGRect中(x: 0, y: 0,宽度:.screenW,高度:self.screenH)) 返回obj }() 覆盖func viewDidLoad () { super.viewDidLoad () view.addSubview(滚动视图) 让subViewH: CGFloat=400 让赢富数据=UIView(框架:CGRect中(x: 0, y: 0,宽度:enW,高度:subViewH)) 赢富数据。写成backgroundColor=UIColor.red scrollView.addSubview(赢富数据) 让bottomView=UIView(框架:CGRect中(x: 0 y: subViewH, h: screenW,高度:subViewH)) bottomView。写成backgroundColor=UIColor.purple scrollView.addSubview (bottomView) 滚动视图。contentSize=CGSize(宽度:screenW高度:iewH * 2) }
<>强效果图强>
<>强特点强>
-
<李>搭建界面简单李>
<李>直观李>
<李>需要占位视图李>
<强>页面结构如图强>
<强>可能出现的问题强>
-
<李>滚动视图中直接添加子元素,报错:有模棱两可的滚动内容高度 李>
<李>滚动视图内容超出屏幕仍不能滚动李>
<>强实现滚动的代码强>
覆盖func viewDidLayoutSubviews () { super.viewDidLayoutSubviews () 让statusBarH: CGFloat=20//如果没有导航栏,就返回状态栏的高度 让navH=gationController& # 63; .navigationBar.frame.maxY & # 63; & # 63;statusBarH 让deltaH=(screenH - navH) - bottomView.frame.maxY placeholderViewBottomConstraint。常数=deltaH }
<>强效果图强>
特点
-
<李>搭建界面简单李>
<李>直观李>
<李>不需要占位视图,不需要对滚动视图的布局做特殊处理李>
<李>需要处理外部视图的框架(如果没有用户交互,可以忽略)李>
页面结构如图
可能出现的问题
-
<李>滚动视图中直接添加子元素,报错:有模棱两可的滚动内容高度 李>
<李>当内容超出屏幕高度时,必须得设置ContainerView的框架,否则不能滚动或者超出屏幕部分不接受事件李>
实现滚动的代码
覆盖func viewDidLoad () { super.viewDidLoad () scrollView.addSubview (containerView) } 覆盖func viewDidLayoutSubviews () { super.viewDidLayoutSubviews () var f=containerView.frame f.size。宽度=screenW//这句代码很重要,处理超出屏幕无法响应事件问题 f.size。身高=bottomView.frame.maxY containerView.frame=f 滚动视图。contentSize=CGSize(宽度:screenW高度:omView.frame.maxY) }
效果图
<强>滚动视图不能滚动的原因强>
-
<李> contentSize <强>小于>强自身框架的尺寸李>