ios - 以编程方式创建的 UIControl 中的自动布局似乎不起作用

标签 ios swift autolayout uikit

我创建了一个名为“TestButton”的 UIControl 子类,带有标签和 imageview subview 。该对象是使用框架创建的,作为初始化过程的一部分,我创建了 subview 元素。

这些“测试按钮”是以编程方式创建的,我从未在 Storyboard中使用它们。

代码片段:

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 的大小以适应 View 。这不起作用,图像显示为全尺寸,并且约束似乎已被忽略。我尝试将约束代码移至 updateConstraints 中并调用它 - 所有这些似乎都有效,但约束再次未应用。

layoutSubviews 确实会在您期望的情况下被调用,但 imageView 框架未修改。输出窗口中没有任何消息,它只是静静地不起作用。

我的问题是;我是否通过指定父级框架以某种方式禁用了自动布局?我希望 autoLayout 仍然在父框架的范围内工作?

很抱歉,如果这个问题之前已经被回答过一次或多次。我实际上不确定我在寻找什么或要问的正确问题,只是在一天的拖网之后才发布。谢谢

最佳答案

TestButton View 的行为将取决于它在其父 View 中的约束方式。

NSLayoutConstraint 中,两个参与属性(或 anchor )都是平等的“伙伴”:只要有这四个约束,imageView 将获取其父级的完整框架( TestButton),但同时TestButton将扩展到足够大以容纳全尺寸图像
您可以对 TestButton View 应用其他约束以防止后者发生。

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

关于ios - 以编程方式创建的 UIControl 中的自动布局似乎不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41983434/

相关文章:

ios - 使用选项卡栏从另一个 View 返回时不会调用 View Controller

ios - 如何在 swift-ios 文件中使用 asl.h

ios - inputAccessoryView 在 iPhone X 上未获取触摸事件

ios - 如何为 iOS 应用程序设置动态背景

ios - 在字典中快速搜索键

ios - UIView动画交互

iphone - 在 iOS 5 上禁用字幕会在屏幕上保留最后显示的字幕文本

ios - 在 Swift 中完成下载后调度?

ios - ScrollView 和 UI 组件的通用自动布局

ios - 使用 autoLayout 在 UITableviewcell 上移动 UILabel 和 UIImageVIew