Swift 4中无法将UILabel添加至UIView的问题求助
你遇到的问题核心在于AutoLayout约束没有生效,导致UILabel无法正确布局渲染。下面是具体原因和修复方案:
问题根源
当用代码创建UIView(比如你的menuView和nameLabel)时,系统默认会开启translatesAutoresizingMaskIntoConstraints = true——这个属性会把视图的frame自动转换为AutoLayout约束。此时你手动添加的居中约束会和系统自动生成的约束冲突,布局引擎会忽略你的自定义约束,最终导致Label无法显示。
修复步骤
只需要给menuView和nameLabel关闭translatesAutoresizingMaskIntoConstraints,让你的自定义约束生效即可。
方案1:在视图初始化时设置
修改menuView和nameLabel的初始化代码,添加关闭自动转换约束的配置:
let menuView: UIView = { let view = UIView() view.backgroundColor = Color.defaultBackgrondColor // 关闭自动转换约束,确保自定义约束生效 view.translatesAutoresizingMaskIntoConstraints = false return view }() let nameLabel: UILabel = { let text = UILabel() text.text = "Chandler Long" text.font = UIFont(name: "Avenir Next", size: 24.0) text.textColor = Color.darkBlue // 同样关闭自动转换约束 text.translatesAutoresizingMaskIntoConstraints = false return text }()
方案2:在setUpView()方法中统一设置
如果你不想修改初始化代码,也可以在setUpView()里统一关闭这个属性:
func setUpView() { // 先关闭自动转换约束 menuView.translatesAutoresizingMaskIntoConstraints = false nameLabel.translatesAutoresizingMaskIntoConstraints = false menuView.addSubview(nameLabel) nameLabel.centerXAnchor.constraint(equalTo: menuView.centerXAnchor).isActive = true nameLabel.centerYAnchor.constraint(equalTo: menuView.centerYAnchor).isActive = true }
额外优化建议
你当前用修改frame的方式做菜单滑入滑出动画,结合AutoLayout的话,更优雅的方式是用约束控制宽度,然后动画约束的constant值:
- 给
menuView添加宽度约束并保存为属性 - 动画时修改约束的
constant,然后调用layoutIfNeeded()
不过这部分是可选优化,先解决Label显示问题后再考虑也没问题。
内容的提问来源于stack exchange,提问作者Chandler Long
相关产品推荐
相关产品推荐

