以编程方式创建的 UIControl 中的 AutoLayout 似乎不起作用
Posted
技术标签:
【中文标题】以编程方式创建的 UIControl 中的 AutoLayout 似乎不起作用【英文标题】:AutoLayout in programmatically created UIControl doesn't appear to work 【发布时间】:2017-02-01 15:25:20 【问题描述】:我创建了一个名为“TestButton”的 UIControl 子类,带有一个标签和一个 imageview 子视图。该对象是用一个框架创建的,作为初始化过程的一部分,我创建了子视图元素。
这些“TestButtons”是以编程方式创建的,我从不在 StoryBoard 中使用它们。
代码sn-p:
class TestButton: UIControl
var iconImageView: UIImageView?
var labelView: UILabel?
required init(size: CGSize, icon: UIImage? text: String?)
super.init(frame: CGRect(x: 0, y: 0, width: size.width, height: size.height) )
if ( (icon != nil) && (text != nil) )
self.iconImageView = UIImageView()
self.iconImageView?.translatesAutoresizingMaskIntoConstraints = false
self.iconImageView?.contentMode = .center
self.iconImageView?.image = icon
self.iconImageView?.backgroundColor = UIColor.yellow // test: show bounds
self.labelView = UILabel()
self.labelView?.translatesAutoresizingMaskIntoConstraints = false
self.labelView?.text = "Test"
self.labelView?.backgroundColor = UIColor.blue
self.addSubview(self.iconImageView!)
//self.addSubview(self.labelView!)
// Setup constraints on created subview(s)
self.iconImageView?.topAnchor.constraint(equalTo: self.topAnchor).isActive = true
self.iconImageView?.leftAnchor.constraint(equalTo: self.leftAnchor).isActive = true
self.iconImageView?.rightAnchor.constraint(equalTo: self.rightAnchor).isActive = true
self.iconImageView?.bottomAnchor.constraint(equalTo: self.bottomAnchor).isActive = true
override func layoutSubviews()
super.layoutSubviews()
print("iconframe: \(self.iconImageView!.frame)")
在上面的示例中,我已从组合中删除了标签。我只是想让 imageView 约束工作并有效地将 imageView 调整为视图。这不起作用,图像显示为全尺寸并且约束似乎已被忽略。我已经尝试将约束代码移动到 updateConstraints 并调用它 - 一切似乎都可以正常工作,但再次没有应用约束。
layoutSubviews 确实会在您期望的时候被调用,但 imageView 框架未修改。输出窗口中没有消息,它只是默默地不起作用。
我的问题是;我是否通过指定父母的框架以某种方式禁用了自动布局?我希望 autoLayout 仍然可以在父框架的范围内工作?
对不起,如果这个问题已经回答过一次或多次。我实际上不确定我在寻找什么或要问的正确问题,只是在拖网一天之后才发布。谢谢
【问题讨论】:
所以我为此苦苦挣扎了 2 天,然后在发布后 5 分钟内修复了它。精氨酸。作为参考,我留下了一段测试代码,在主视图上调用 translatesAutoresizingMaskIntoConstraints = false。 代码对我来说看起来不错。但是 - 你没有发布任何关于 TestButton 实例是如何布局的信息。看起来图像应该是按钮的整个大小。最后一个想法 - 你是否关闭了按钮的自动调整大小掩码?您可以直接在 init(coder:) 中添加 self..translatesAutoresizingMaskIntoConstraints = false。 @kric 如果您自己找到了解决方案,请考虑发布并接受您自己的答案。 【参考方案1】:TestButton 视图的行为将取决于它在其父视图中的约束方式。
在NSLayoutConstraint
s 中,两个参与属性(或锚点)都是平等的“伙伴”:只有这四个约束,imageView 将占据其父级的全帧(TestButton),但在同时 TestButton 将扩展为足够大以容纳全尺寸图像。
您可以对 TestButton 视图应用其他约束以防止后者发生。
要了解标准视图为何会这样,请查看 intrinsicContentSize
属性 (docs)。它由标准控件实现,并告诉自动布局系统视图应该有多大,完全基于它的内容(例如,UIButton 或 UISwitch 是自动调整大小的)。 UIImageView 的intrinsicContentSize
是其图像的大小,这就是为什么它会在没有任何阻碍的情况下展开全尺寸。
【讨论】:
这涵盖了它。再次感谢以上是关于以编程方式创建的 UIControl 中的 AutoLayout 似乎不起作用的主要内容,如果未能解决你的问题,请参考以下文章
以编程方式将 UIView 更改为 UIControl 的实例 [关闭]
将 UITapGestureRecognizer 添加到 UIControl
以编程方式从 MATLAB 获取 GUI 数据(无 GUIDE)