以编程方式创建的 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 视图的行为将取决于它在其父视图中的约束方式。

NSLayoutConstraints 中,两个参与属性(或锚点)都是平等的“伙伴”:只有这四个约束,imageView 将占据其父级的全帧(TestButton),但在同时 TestButton 将扩展为足够大以容纳全尺寸图像。 您可以对 TestButton 视图应用其他约束以防止后者发生。

要了解标准视图为何会这样,请查看 intrinsicContentSize 属性 (docs)。它由标准控件实现,并告诉自动布局系统视图应该有多大,完全基于它的内容(例如,UIButton 或 UISwitch 是自动调整大小的)。 UIImageView 的intrinsicContentSize 是其图像的大小,这就是为什么它会在没有任何阻碍的情况下展开全尺寸。

【讨论】:

这涵盖了它。再次感谢

以上是关于以编程方式创建的 UIControl 中的 AutoLayout 似乎不起作用的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式添加 UIControl

以编程方式将 UIView 更改为 UIControl 的实例 [关闭]

将 UITapGestureRecognizer 添加到 UIControl

以编程方式从 MATLAB 获取 GUI 数据(无 GUIDE)

如何以编程方式获取 UIBarButtonItems 的状态?

在 IOS 中以编程方式设置动作侦听器