iOS - 以编程方式在具有自动布局的 UITextField 内定位 UIImageView

Posted

技术标签:

【中文标题】iOS - 以编程方式在具有自动布局的 UITextField 内定位 UIImageView【英文标题】:iOS - Positioning programmatically a UIImageView inside a UITextField with auto layout 【发布时间】:2015-11-09 14:55:17 【问题描述】:

我想以编程方式添加一个图像视图(复选标记)作为一个文本字段的子视图。由于我对所有视图都使用自动布局,因此我想使用约束来定位此子视图。代码如下:

class UIFormTextField: UITextField 

    lazy var checkMarkView = UIImageView(image: UIImage(named: "BarButtonItemCheck"))

    func setCheckMarkView() 
        self.addSubview(checkMarkView)
        self.addConstraints([
            NSLayoutConstraint(item: checkMarkView, attribute: .CenterY, relatedBy: .Equal, toItem: self, attribute: .CenterY, multiplier: CGFloat(1), constant: CGFloat(0)),
            NSLayoutConstraint(item: checkMarkView, attribute: .Trailing, relatedBy: .Equal, toItem: self, attribute: .Trailing, multiplier: CGFloat(1), constant: -UIStyle.Size.standardHorizontalSpacing)
            ])
    

我在 viewDidLoad 函数中调用了setCheckMarkView,但它不起作用。我收到一条警告:“可能以下列表中的至少一个约束是您不想要的。”

这是列表,但我不明白为什么其他约束会干扰新视图。

"<NSAutoresizingMaskLayoutConstraint:0x15084acf0 h=--& v=--& UIImageView:0x15089f4d0.midX == + 12>",
"<NSAutoresizingMaskLayoutConstraint:0x14f691d70 h=--& v=--& H:[UIImageView:0x15089f4d0(24)]>",
"<NSLayoutConstraint:0x1509c54e0 H:[Bruce.UIFormTextField:0x150895520]-(0)-|   (Names: '|':Bruce.UIForm:0x150998430 )>",
"<NSLayoutConstraint:0x1509a6120 H:|-(0)-[Bruce.UIFormTextField:0x150895520]   (Names: '|':Bruce.UIForm:0x150998430 )>",
"<NSLayoutConstraint:0x14f593e20 H:[Bruce.UIForm:0x150998430]-(0)-|   (Names: '|':UIView:0x1509c92d0 )>",
"<NSLayoutConstraint:0x150950f10 H:|-(0)-[Bruce.UIForm:0x150998430]   (Names: '|':UIView:0x1509c92d0 )>",
"<NSLayoutConstraint:0x14f6143b0 UIView:0x1509c92d0.width == UIView:0x15094e8f0.width>",
"<NSLayoutConstraint:0x150813210 UIImageView:0x15089f4d0.trailing == Bruce.UIFormTextField:0x150895520.trailing - 20>",
"<NSLayoutConstraint:0x150896350 'UIView-Encapsulated-Layout-Width' H:[UIView:0x15094e8f0(320)]>"

感谢您的帮助,

【问题讨论】:

我不清楚您要达到的目标。在我个人看来,对如此重要的组件进行子类化并不是一个好主意。另一种解决方案是组合您的组件,从一个视图构建,该视图具有一个文本字段,其中一个图像视图作为兄弟 你好安德里亚。我的目标是在用户输入有效时显示复选标记,并在输入无效时隐藏它。我将文本字段子类化以实现几种方法,例如“nextResponder”或“setInputAccessoryView”。我已经设法构建了一个具有 2 个视图(TextField 和 ImageView)的组件,但我必须将 ImageView 放在文本字段上方(它不透明)。或者在这种情况下,图像阻止点击文本字段。因此,我一直在寻找带有子视图的更清洁的解决方案。 【参考方案1】:

问题是您需要禁用 imageView 上的translatesAutoresizingMaskIntoConstraints 属性。这就是为什么您会看到约束存在“NSAutoresizingMaskLayoutConstraint”问题

更新后的代码:

lazy var checkMarkView: UIImageView = 
    let imageView = UIImageView(image: UIImage(named: "BarButtonItemCheck"))
    imageView.translatesAutoresizingMaskIntoConstraints = false
    return imageView
()

编辑: 您实际上不需要禁用声明 checkMarkView 的属性。您也可以在您的函数“setCheckMarkView”中执行此操作,即

func setCheckMarkView() 
    checkMarkView.translatesAutoresizingMaskIntoConstraints = false
    self.addSubview(checkMarkView)
    self.addConstraints([
        NSLayoutConstraint(item: checkMarkView, attribute: .CenterY, relatedBy: .Equal, toItem: self, attribute: .CenterY, multiplier: CGFloat(1), constant: CGFloat(0)),
        NSLayoutConstraint(item: checkMarkView, attribute: .Trailing, relatedBy: .Equal, toItem: self, attribute: .Trailing, multiplier: CGFloat(1), constant: -UIStyle.Size.standardHorizontalSpacing)
        ])

【讨论】:

非常感谢@Lneuner。

以上是关于iOS - 以编程方式在具有自动布局的 UITextField 内定位 UIImageView的主要内容,如果未能解决你的问题,请参考以下文章

使用自动布局iOS以编程方式滚动到特定页面/位置

iOS底部对齐具有编程自动布局约束的对象

以编程方式具有自动布局的滚动视图

使用自动布局约束以编程方式创建四个具有相同高度和宽度的 UIView

ios自动布局视觉格式-对齐

如何在 ios swift 中以编程方式创建自动布局等宽约束?