我有一个 BoardViewController (UIViewController),需要在其背景中绘制居中的坐标线。对于这些坐标线,我创建了一个自定义的UIView类 CoordinateView ,它们被添加为subView。即使在更改设备方向时,coordinateView也应居中并填满整个屏幕。
为此,我想在代码中使用自动布局。这是我目前的设置:
在 CoordinatesView (UIView)类中,坐标线的自定义绘制方法
- (void)drawRect:(CGRect)rect {
[super drawRect:rect];
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetStrokeColorWithColor(context, [UIColor whiteColor].CGColor);
CGContextSetLineWidth(context, 1.0);
CGContextMoveToPoint(context, self.bounds.size.width/2,0);
CGContextAddLineToPoint(context, self.bounds.size.width/2,self.bounds.size.height);
CGContextStrokePath(context);
CGContextMoveToPoint(context, 0,self.bounds.size.height/2);
CGContextAddLineToPoint(context, self.bounds.size.width,self.bounds.size.height/2);
CGContextStrokePath(context);
}
在 BoardViewController
中初始化此 coordinatesView 对象- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
...
coordinatesView = [[CoordinatesView alloc]initWithFrame:self.view.frame];
[coordinatesView setBackgroundColor:[UIColor redColor]];
[coordinatesView clipsToBounds];
[coordinatesView setTranslatesAutoresizingMaskIntoConstraints:NO];
[self.view addSubview:coordinatesView];
[self.view sendSubviewToBack:coordinatesView];
...
}
将自动布局魔法添加到BoardViewController的 viewWillAppear 功能中的coordinateView
-(void)viewWillAppear:(BOOL)animated{
...
NSLayoutConstraint *constraintCoordinatesCenterX =[NSLayoutConstraint
constraintWithItem:self.view
attribute:NSLayoutAttributeCenterX
relatedBy:NSLayoutRelationEqual
toItem:coordinatesView
attribute:NSLayoutAttributeCenterX
multiplier:1.0
constant:1];
NSLayoutConstraint *constraintCoordinatesCenterY =[NSLayoutConstraint
constraintWithItem:self.view
attribute:NSLayoutAttributeCenterY
relatedBy:NSLayoutRelationEqual
toItem:coordinatesView
attribute:NSLayoutAttributeCenterY
multiplier:1.0
constant:1];
[self.view addConstraint: constraintCoordinatesCenterX];
[self.view addConstraint: constraintCoordinatesCenterY];
...
}
注意:这种方法适用于我使用UIImageView图像作为坐标,但它不适用于自定义UIView coordinateView。
如何让它再次运作?当我应用Auto Layout / NSLayoutConstraint时,我的coordinatesView UIView似乎消失了
这实际上是一种向UIViewController添加背景图形的好方法,还是直接绘制到UIViewController更好。 (如果是这样的话怎么样?)
感谢您对此的帮助。
答案 0 :(得分:3)
您的视图会因为没有设置大小限制而消失 - 您通常需要4个约束才能完全表达视图的位置和大小。某些视图(如按钮)具有固有的内容大小,因此您无需显式设置大小。对于图像视图也是如此,图像视图从它们显示的图像中获取它们的大小。
因此,在您的情况下,您可以将宽度和高度设置为等于超视图的宽度和高度。这是我经常做的事情,所以我在UIView上创建了一个包含各种约束方法的类别,所以我不必一遍又一遍地写这个。我有一个方法constrainViewEqual:你做你想做的事情:
#import "UIView+RDConstraintsAdditions.h"
@implementation UIView (RDConstraintsAdditions)
-(void)constrainViewEqual:(UIView *) view {
[view setTranslatesAutoresizingMaskIntoConstraints:NO];
NSLayoutConstraint *con1 = [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeCenterX relatedBy:0 toItem:view attribute:NSLayoutAttributeCenterX multiplier:1 constant:0];
NSLayoutConstraint *con2 = [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeCenterY relatedBy:0 toItem:view attribute:NSLayoutAttributeCenterY multiplier:1 constant:0];
NSLayoutConstraint *con3 = [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeWidth relatedBy:0 toItem:view attribute:NSLayoutAttributeWidth multiplier:1 constant:0];
NSLayoutConstraint *con4 = [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeHeight relatedBy:0 toItem:view attribute:NSLayoutAttributeHeight multiplier:1 constant:0];
NSArray *constraints = @[con1,con2,con3,con4];
[self addConstraints:constraints];
}
然后,在您的主代码中,您可以这样调用它:
[self.view constrainViewsEqual:coordinatesView];