以编程方式使用约束来集中UIIMageView

时间:2015-06-16 15:54:36

标签: ios objective-c uiimageview autolayout xib

我正在开发一个iOS项目,我需要以编程方式为视图使用约束。我已经习惯了故事板,但由于项目规范的性质,我正在为这个特定的项目使用xib。

我有一个MainViewController,我在.h文件中创建了以下属性:

@property (nonatomic, strong) IBOutlet UIImageView *backgroundImageView;
@property (nonatomic, strong) IBOutlet UIImageView *logoImage;

我将这些UIImageView实例添加到我的XIB文件中,并通过Attributes检查器选择了适当的图像。

在我的.m文件中,我有一个addConstraints方法,在viewDidLoad中调用。在此方法中,我确保关闭将autoresizingMasks转换为约束:

self.backgroundImageView.translatesAutoresizingMaskIntoConstraints = NO;
self.logoImage.translatesAutoresizingMaskIntoConstraints = NO;

然后,我设置了约束,以便背景图像占据整个superview:

id mainView = @{@"background": self.backgroundImageView};

//Set constraints so that the background takes up the entirety of the superview
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[background]|" options:0 metrics:nil views:mainView]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[background]|" options:0 metrics:nil views:mainView]];

最后,我设置了约束,以便徽标视图位于视图的中心(这是我出错的地方):

// Width constraint
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.logoImage
                                                 attribute:NSLayoutAttributeWidth
                                                 relatedBy:NSLayoutRelationEqual
                                                    toItem:self
                                                 attribute:NSLayoutAttributeWidth
                                                multiplier:0.5
                                                  constant:0]];

// Height constraint
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.logoImage
                                                 attribute:NSLayoutAttributeHeight
                                                 relatedBy:NSLayoutRelationEqual
                                                    toItem:self
                                                 attribute:NSLayoutAttributeHeight
                                                multiplier:0.5
                                                  constant:0]];

// Center horizontally
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.logoImage
                                                 attribute:NSLayoutAttributeCenterX
                                                 relatedBy:NSLayoutRelationEqual
                                                    toItem:self
                                                 attribute:NSLayoutAttributeCenterX
                                                multiplier:1.0
                                                  constant:0.0]];

// Center vertically
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.logoImage
                                                 attribute:NSLayoutAttributeCenterY
                                                 relatedBy:NSLayoutRelationEqual
                                                    toItem:self
                                                 attribute:NSLayoutAttributeCenterY
                                                multiplier:1.0
                                                  constant:0.0]];

我收到的错误是

  

*** + [NSLayoutConstraint constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:]:   约束项必须是UIView或子类'

的实例

,我不完全理解,因为我的约束项(两个UIImageView实例)是UIView的子类,但我可能误解了这一点。任何人都可以帮助指出我出错的地方吗?

1 个答案:

答案 0 :(得分:13)

< p>试试:< / p> < pre>< code> //宽度约束 [self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.logoImage                                                  属性:NSLayoutAttributeWidth                                                  relatedBy:NSLayoutRelationEqual                                                     toItem:self.backgroundImageView                                                  属性:NSLayoutAttributeWidth                                                 乘数:0.5                                                   常数:0]]; //高度约束 [self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.logoImage                                                  属性:NSLayoutAttributeHeight                                                  relatedBy:NSLayoutRelationEqual                                                     toItem:self.backgroundImageView                                                  属性:NSLayoutAttributeHeight                                                 乘数:0.5                                                   常数:0]]; //水平居中 [self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.logoImage                                                  属性:NSLayoutAttributeCenterX                                                  relatedBy:NSLayoutRelationEqual                                                     toItem:self.backgroundImageView                                                  属性:NSLayoutAttributeCenterX                                                 乘数:1.0                                                   常数:0.0]]; //垂直居中 [self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.logoImage                                                  属性:NSLayoutAttributeCenterY                                                  relatedBy:NSLayoutRelationEqual                                                     toItem:self.backgroundImageView                                                  属性:NSLayoutAttributeCenterY                                                 乘数:1.0                                                   常数:0.0]]; < /代码>< /预> < p>您试图在< code> UIImageView< / code>之间定义约束。和你的视图控制器。您必须在作为同一视图的子视图的视图之间定义约束。< / p>