给子视图添加leading/trailing/top/bottom约束无效问题求助
解决UIKit Playground中添加四边约束后视图消失的问题
兄弟,我之前也踩过一模一样的坑!你这个问题大概率是两个核心原因导致的:约束冲突,或者父视图没有明确的尺寸让布局系统计算。我给你拆解一下,再给你修正后的代码。
问题根源分析
- 子视图的自动转换约束没关:默认情况下,UIView的
translatesAutoresizingMaskIntoConstraints是true,系统会根据视图的frame自动生成约束。当你手动添加leading/trailing/top/bottom约束时,这两套约束就会打架,布局引擎直接懵了,干脆把视图都藏起来。 - 父视图没有明确尺寸:Playground里的父视图如果没有设置frame或者尺寸约束,布局系统只知道子视图要贴满父视图,但不知道父视图本身多大,最后会把父视图压缩成0x0的小方块,自然啥也看不到。
修正后的代码
//: 基于UIKit的Playground用于展示用户界面 import UIKit import PlaygroundSupport class MyView: UIView { override init(frame: CGRect) { super.init(frame: frame) setupViews() } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } private func setupViews() { backgroundColor = .black let blueView = UIView() blueView.backgroundColor = .blue // *关键第一步*:禁用自动转换约束,避免和手动约束冲突 blueView.translatesAutoresizingMaskIntoConstraints = false addSubview(blueView) // 激活四边约束 NSLayoutConstraint.activate([ blueView.leadingAnchor.constraint(equalTo: self.leadingAnchor), blueView.trailingAnchor.constraint(equalTo: self.trailingAnchor), blueView.topAnchor.constraint(equalTo: self.topAnchor), blueView.bottomAnchor.constraint(equalTo: self.bottomAnchor) ]) } } // *关键第二步*:给父视图设置明确的尺寸,或者添加尺寸约束 let parentView = MyView(frame: CGRect(x: 0, y: 0, width: 300, height: 300)) // 把父视图放到Playground的实时视图里 PlaygroundPage.current.liveView = parentView
额外排查技巧
如果你还是有问题,可以试试这两个方法:
- 打开Playground的Debug View Hierarchy,看看视图的实际尺寸是不是0x0,有没有约束冲突的标记
- 在控制台打印约束:
po parentView.constraints或者po blueView.constraints,看看有没有冲突的约束提示
内容的提问来源于stack exchange,提问作者Adam Carter
相关产品推荐
相关产品推荐

