2015-11-09 40 views
0

我想以编程方式将图像视图(复选标记)添加为一个文本字段的子视图。由于我在所有视图中使用自动布局,因此我想使用约束来定位此子视图。下面是代码:iOS - 以自动布局在UITextField中以编程方式定位UIImageView

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:0xUIImageView:0x15089f4d0.trailing == Bruce.UIFormTextField:0x150895520.trailing - 20>", 
"<NSLayoutConstraint:0x150896350 'UIView-Encapsulated-Layout-Width' H:[UIView:0x15094e8f0(320)]>" 

感谢您的帮助,

+0

我没有清楚你想要达到的目标。我个人认为,划分这样一个重要组件并不是一个好主意。另一种解决方案是组合你的组件,从一个带有图像视图的文本字段的视图构建,作为兄弟 – Andrea

+0

Hello Andrea。我的目标是在用户输入有效时显示复选标记,并在不存在时将其隐藏。我为textfield子类实现了几个方法,如“nextResponder”或“setInputAccessoryView”。我已经设法构建了一个包含2个视图(TextField和ImageView)的组件,但是我必须将ImageView放在文本框的上方(它不透明)。或者在这种情况下,图像阻止点击文本字段。因此,我正在寻找一个更清晰的子视图解决方案。 – Helmikku

回答

3

的问题是,你需要禁用对的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) 
     ]) 
} 
+0

非常感谢@Lneuner。 – Helmikku

相关问题