UIScrollView作为第一个初始化View,导致其内的第一个UIimageView只显示一半的高度

本文解决了一个UIImageView无法完全填充UIScrollView的问题,发现UIScrollView初始化顺序影响显示效果,并调整contentInset参数为0解决问题。
本来正常的话,UIImageView会在UIScrollView内占满的,但是第一个UIImageView只占了高度的一半左右。如下图,红色的是UIScrollView的背景色,还有那么多没有填充,但是UIImageView的frame已经设置为UIScrollView的frame了。
原因竟然是 UIScrollView 是第一个初始化的,把它的初始化放在后面,先初始化其他的 控件,然后再初始化它和它的子控件。


主要还是以下的参数没有设置:设为0就可以了

UIEdgeInsets contentInset :这个属性可以在四周增加滚动范围

UIEdgeInsetsMake(30, 0, 0, 0);

出现“第六个按钮消失”的问题,通常是由以下几个原因引起的: 1. **布局约束未正确设置**:第二个排的按钮没有被正确添加到视图层级中,或者其约束未绑定到 `contentView` 或父视图。 2. **`contentView.contentSize` 未更新**:`UIScrollView` 类型的 `contentView` 的内容大小未正确计算或更新,导致超出可视区域的内容不可见。 3. **SnapKit 约束覆盖/冲突**:可能在其他地方对按钮设置了新的约束,导致之前设置的约束失效。 --- ### ✅ 解决方案 我们从几个方面来检查并修复代码: #### 1. 确保所有按钮都被加入到视图中 确保你将所有的按钮都加到了 `contentView` 中,并且没有遗漏: ```swift for btn in views { contentView.addSubview(btn) } ``` #### 2. 更新 `contentSize` 以包含第二排按钮的高度 请确保 `contentView.contentSize.height` 包含了两行按钮的高度间距。比如: ```swift let rowHeight: CGFloat = btnWH + 10 // 每一行的高度(包括行间距) let totalHeight = rowHeight * 2 // 如果有两行 self.contentView.contentSize = CGSize(width: CGRectGetWidth(self.frame), height: totalHeight) ``` #### 3. 使用 `UILayoutGuide` 或固定高度容器处理多行布局 如果使用 `UIScrollView` 布局多个行,可以考虑为每一行创建一个 `UIView` 容器,这样更便于管理。 例如: ```swift let firstRowContainer = UIView() let secondRowContainer = UIView() firstRowContainer.translatesAutoresizingMaskIntoConstraints = false secondRowContainer.translatesAutoresizingMaskIntoConstraints = false contentView.addSubview(firstRowContainer) contentView.addSubview(secondRowContainer) // 设置容器位置 firstRowContainer.snp.makeConstraints { make in make.leading.trailing.equalToSuperview() make.top.equalToSuperview() } secondRowContainer.snp.makeConstraints { make in make.leading.trailing.equalToSuperview() make.top.equalTo(firstRowContainer.snp.bottom).offset(10) } // 将前5个按钮加到第一行容器 for i in 0..<min(views.count, 5) { let btn = views[i] btn.snp.remakeConstraints { make in if i == 0 { make.leading.equalToSuperview().offset(lrMargin) } else { make.leading.equalTo(views[i - 1].snp.trailing).offset(itemMargin) } make.centerY.equalToSuperview() make.width.equalTo(btnWH) make.height.lessThanOrEqualTo(btnWH) make.height.greaterThanOrEqualTo(btnH) } } // 将第6个及之后的按钮加到第二行容器 for i in 5..<views.count { let btn = views[i] btn.snp.remakeConstraints { make in if i == 5 { make.leading.equalToSuperview().offset(lrMargin) } else { make.leading.equalTo(views[i - 1].snp.trailing).offset(itemMargin) } make.centerY.equalToSuperview() make.width.equalTo(btnWH) make.height.lessThanOrEqualTo(btnWH) make.height.greaterThanOrEqualTo(btnH) } } ``` #### 4. 确保 `UIScrollView` 的 `isScrollEnabled` `showsVerticalScrollIndicator` 是开启的 有时候即使 `contentSize` 正确,但因为滚动被禁用了,所以看不到更多内容: ```swift contentView.isScrollEnabled = true contentView.showsVerticalScrollIndicator = true ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值