本帖子主要用于记录个人ios 学习遇到的小问题。
UIScrollView和 SnapKit 的兼容问题
我布局的时候,先是按下面的内容这么写,然后就发现我的 UIScrollView 内部的contentView 是没有宽度的,讲道理我已经设置了宽度的约束,应该是不会这样子的。
override func viewDidLoad() {
super.viewDidLoad()
self.title = "Root"
let scrollView = UIScrollView()
self.view.addSubview(scrollView)
let contentView = UIView()
contentView.backgroundColor = .red
scrollView.addSubview(contentView)
scrollView.snp.makeConstraints { make in
make.top.leading.trailing.bottom.equalToSuperview()
}
contentView.snp.makeConstraints { make in
make.edge.equalToSuperview()
make.height.equalTo(1000)
}
}
很多资料都是讲的错的,后来看到一个讲 SnapKit 的帖子说,需要确定一下宽度,才可以,然后就去试了一下这样子写,就是把他的宽度约束为左右都顶到 self.view 的左右,或者是固定宽度。
//写法 1
contentView.snp.makeConstraints { make in
make.top.bottom.equalToSuperview()
make.leading.trailing.equalTo(self.view)
make.height.equalTo(1000)
}
//写法 2
contentView.snp.makeConstraints { make in
make.top.bottom.equalToSuperview()
make.width.equalTo(self.view)
make.height.equalTo(1000)
}
这个时候他的 contentView 就能够显示出来了,然后需要给里面填充内容的时候,直接加到这个 contentView 中就可以了。
这个时候问题就解决了。但是还是需要思考一下为什么?
-
可能是因为 UIScrollView 结合了 SnapKit 框架后,他的宽度在没有放内容的情况下,是 0,所以我的 contentView 放进去以后如果宽度是按照 UIScrollView 约束的,值就是 0
打印了一下 scrollView 的宽度发现是有值的,那这个想法就是错误的。 -
可能是因为,UIScrollView 内部的 contentSize 的宽度在纵向滚动的时候,必须是要确定的值,虽然不知道具体原因但是规则可能是如此,既然纵向滚动需要横向是确定的值,那反过来的话横向滚动纵向必须是确定的值
于是我确认了一下,横向的结果,果然如此,如果是横向的情况下,我不确定具体的高度,就会导致内部的 contentView 是的高度为 0
//错误写法
contentView.snp.makeConstraints { make in
make.leading.trailing.equalToSuperview()
make.height.equalTo(scrollView)
make.width.equalTo(600)
}
//正确写法
contentView.snp.makeConstraints { make in
make.leading.trailing.equalToSuperview()
make.height.equalTo(self.view)
make.width.equalTo(600) //这个宽度是按照自己需要的宽度去填的,如果有其他的图片也可以用第三种写法
}
//不指定宽度的写法
override func viewDidLoad() {
super.viewDidLoad()
self.title = "Root"
let scrollView = UIScrollView()
self.view.addSubview(scrollView)
let contentView = UIView()
contentView.backgroundColor = .red
scrollView.addSubview(contentView)
scrollView.snp.makeConstraints { make in
make.top.leading.trailing.bottom.equalToSuperview()
}
contentView.snp.makeConstraints { make in
make.leading.trailing.equalToSuperview()
make.height.equalTo(self.view)
}
let imageView = UIImageView()
imageView.image = UIImage(named: "zhl")
contentView.addSubview(imageView)
imageView.snp.makeConstraints { make in
make.top.bottom.equalToSuperview()
make.leading.equalToSuperview()
make.trailing.equalToSuperview()
}
}
如果不指定宽度/高度的话,可以通过给内部添加控件,并且设置约束来判断contentView 的宽度来实现判断滚动长度的效果。
以上为个人总结,有啥不太好或者不太正确的地方恳请各方大佬批评指正。