概要

在iOS开发学习中,UIScrollView是绕不过去的一个重要控件。

但是相对于Android的ScrollView,iOS的这个滚动控件的用法简直是复杂一万倍。。。

最主要是目前能找到的大部分的视频教程看到的关于UIScrollView的教程,都是使用Frame布局。没有找到使用AutoLayout布局的教程。。只有看文字教程学习,然后自己总结一下。

StoryBoard操作布局

在storyboard中,拖入一个UIScrollView,然后打开右侧的show the size inspector,去掉勾选content layout guides,然后设置UIScrollView的上下左右约束为0,然后重新勾选content layout guides

到这里发现Xcode提示约束有错误,原因是是因为UIScrollView的需要有一个ContentView来确定自己的滚动区域。

于是再拖一个UIView到UIScrollView上,然后改名这个UIView为ContentView,鼠标右键拖动这个UIView到UIScrollView的content layout guides上,按住shift勾选前四个约束,让UIScrollView和ContentView四个边建立约束。

然后调整ContentView的约束的constant的值,Xcode默认建立的约束好像不太完美,默认给你自动计算了ContentView的初始大小。

把这个几个调整为0

最好这个几个设置后,发现约束错误的红点依然没有消失。。。点开一看。

说明UIScrollView无法根据宽高确定滚动方向。需要设置一下宽高。因为是移动设备。默认应该是Y轴滚动。

那就设置一下宽等于UIScrollView的宽度。高度设为一个高一点的的值,即可滚动

鼠标右键拖动ContentView到Frame Layout Guides上,然后约束ContentView和Frame Layout Guides宽度一样。

然后单独设置ContentView的高度为1000,就发现约束错误的红点没了,运行程序,白色背景出现滚动条,可以上下滑动滚动了。

使用纯代码布局

思路和使用StoryBoard一样。只是用代码描述出来而已

        let sv = UIScrollView();
sv.translatesAutoresizingMaskIntoConstraints = false
self.view.addSubview(sv)
sv.backgroundColor = UIColor.systemGray;
sv.topAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.topAnchor).isActive = true
sv.leadingAnchor.constraint(equalTo: self.view.leadingAnchor).isActive = true
sv.bottomAnchor.constraint(equalTo: self.view.bottomAnchor).isActive = true
sv.trailingAnchor.constraint(equalTo: self.view.trailingAnchor).isActive = true let contentView = UIView()
contentView.translatesAutoresizingMaskIntoConstraints = false
sv.addSubview(contentView)
contentView.layer.name = "contentView"
contentView.backgroundColor = UIColor.white
contentView.leadingAnchor.constraint(equalTo: sv.contentLayoutGuide.leadingAnchor).isActive = true
contentView.topAnchor.constraint(equalTo: sv.contentLayoutGuide.topAnchor).isActive = true
contentView.trailingAnchor.constraint(equalTo: sv.contentLayoutGuide.trailingAnchor).isActive = true
contentView.bottomAnchor.constraint(equalTo: sv.bottomAnchor).isActive = true
contentView.widthAnchor.constraint(equalTo: sv.frameLayoutGuide.widthAnchor).isActive = true
contentView.heightAnchor.constraint(equalToConstant: 1000).isActive = true

欢迎关注我的公众号和我交流

最新文章

  1. 搭建LNAMP环境(五)- PHP7源码安装Redis和Redis拓展
  2. 摸索js的3d全景
  3. Conntect Bluetooth devices in iOS.
  4. 数据人员Sql必会——行转列
  5. css文件内引用外部资源文件的相对路径
  6. 关于arguments对象以及函数的柯里化;
  7. VS2010/MFC编程入门之三(VS2010应用程序工程中文件的组成结构)
  8. 天草(初级+中级+高级)VIP和黑鹰VIP破解教程(全部iso下载地址)
  9. Win7资源管理器已停止工作——StackHash_6c37,R6205错误
  10. android签名相关
  11. webpack和webpack-dev-server的区别
  12. Advanced Installer 9.8打包实录
  13. 【struts2】ActionContext与ServletActionContext
  14. JPA实现复杂条件分页查询
  15. HDFS深度历险 之 从客户端逻辑看HDFS写入机制
  16. Bootstrap里的Modal框
  17. tensorflow安装过程cpu版-(windows10环境下)---亲试可行方案
  18. 线上分享-- 基于DDD的.NET开发框架-ABP介绍
  19. webpack 创建vue项目过程中遇到的问题和解决方法
  20. 学习笔记12—linux下文件的复制、移动与删除

热门文章

  1. JDBC中的元数据——1.数据库元数据
  2. 在vue中引入版本为"echarts": "^5.1.2"图表
  3. 二.Go微服务--令牌桶
  4. Spring Boot +Vue 项目实战笔记(一):使用 CLI 搭建 Vue.js 项目
  5. 那些优秀的python代码
  6. C# - 习题05_写出程序的输出结果o1.count
  7. Java同步之线程池详解
  8. Centos8.3安装broadcom(博通)BCM43142无线网卡驱动,Centos8没有wifi选项(No wifi adapter found centos)解决办法
  9. 磁盘“Seagate”没有被推出,因为一个或多个程序可能正在使用它。
  10. C#多线程开发-线程池03