Swift中如何让UIScrollView内部UIView在横竖屏切换时适配屏幕
UIScrollView内部子视图横竖屏自动适配问题
核心诉求
在Swift开发场景下,开发者需要实现UIScrollView内部承载的UIView,在用户将设备从竖屏切换为横屏时,自动匹配新的屏幕尺寸完成布局适配。
当前实现代码
var scrollView: UIScrollView = { var scroll = UIScrollView() scroll.translatesAutoresizingMaskIntoConstraints = false return scroll }() view.addSubview(scrollView) // scrollView 约束配置 scrollView.topAnchor.constraint(equalTo: view.topAnchor, constant: 100).isActive = true scrollView.centerXAnchor.constraint(equalTo: view.centerXAnchor, constant: 0).isActive = true scrollView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 0).isActive = true scrollView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: 0).isActive = true scrollView.heightAnchor.constraint(equalToConstant: 500).isActive = true // 内部内容视图与滚动范围配置 for i in 0..<arr.count { var contentView = UIView() contentView.frame = CGRect( x: i * Int(view.bounds.size.width) + 10, y: 0, width: Int(view.bounds.size.width) - 20, height: Int(view.frame.height) ) scrollView.contentSize = CGSize( width: view.frame.size.width * CGFloat((Double(i)+1)), height: scrollView.frame.size.height ) }
现有实现的布局缺陷
- 水平方向约束冗余:同时配置centerX、leading、trailing三个水平约束,其中leading与trailing已经可以完全确定scrollView的水平位置与宽度,多余的centerX约束没有实际布局价值
- 子视图未接入自动布局体系:循环生成的内部contentView通过初始化阶段的屏幕宽高计算硬编码frame,没有通过AutoLayout约束建立和父视图的关联关系,设备旋转触发系统布局更新时,不会自动重算frame值
- 滚动范围配置失效:scrollView的contentSize也是在初始化阶段基于当时的屏幕宽度一次性计算完成,没有跟随屏幕尺寸变化动态更新
- 高度布局逻辑脱节:scrollView被设置了固定500点的高度常量约束,内部contentView的高度却直接读取控制器主view的frame高度,二者没有形成约束绑定,旋转后会出现布局错位
内容的提问来源于stack exchange,提问作者sai kumar
相关产品推荐
相关产品推荐

