Центрировать пользовательский UIView вертикально и горизонтально с помощью Auto Layout
Я пытаюсь создать довольно простой анимированный пользовательский интерфейс, используя новый API-интерфейс Auto Layout API, доступный только для iOS 6. У пользовательского представления, которое я создаю, есть круг, который я хочу как по вертикали, так и по горизонтали.
К сожалению, я не могу понять, почему мои ограничения, похоже, отлично работают для UIButton и элементов UILabel, но приносят странные результаты, когда я использую пользовательский вид с настраиваемым CALayer (в этом случае круг, который в конечном итоге будет анимирован).
Чтобы быть ясным, я не хочу, чтобы мое представление расширялось, чтобы заполнить весь экран, а скорее иметь динамическое "дополнение", чтобы представление было вертикально центрировано как на iPhone 4, так и на 5. Я также должен отметить, что я 'очень новый для Cocoa и UIKit.
RootViewController.m:
...
- (void)viewDidLoad {
[super viewDidLoad];
// Create Circle View
CGRect circle_view_rect = CGRectMake(0, 0, 100, 100);
UIView *circle_view = [[UIView alloc] initWithFrame:circle_view_rect];
// Create Circle Layer
CircleLayer *circle_layer = [[CircleLayer alloc] init];
circle_layer.needsDisplayOnBoundsChange = YES;
circle_layer.frame = circle_view.bounds;
[circle_view.layer addSublayer:circle_layer];
// Enable Auto Layout
[circle_view setTranslatesAutoresizingMaskIntoConstraints:NO];
[self.view addSubview:circle_view];
// Center Vertically
NSLayoutConstraint *centerYConstraint =
[NSLayoutConstraint constraintWithItem:circle_view
attribute:NSLayoutAttributeCenterY
relatedBy:NSLayoutRelationEqual
toItem:self.view
attribute:NSLayoutAttributeCenterY
multiplier:1.0
constant:0.0];
[self.view addConstraint:centerYConstraint];
// Center Horizontally
NSLayoutConstraint *centerXConstraint =
[NSLayoutConstraint constraintWithItem:circle_view
attribute:NSLayoutAttributeCenterX
relatedBy:NSLayoutRelationEqual
toItem:self.view
attribute:NSLayoutAttributeCenterX
multiplier:1.0
constant:0.0];
[self.view addConstraint:centerXConstraint];
}
...
CircleLayer.m:
...
- (void)drawInContext:(CGContextRef)context {
CGContextAddArc(context, 50, 50, 50, 0.0, 2*M_PI, 0);
CGContextSetFillColorWithColor(context, [UIColor yellowColor].CGColor);
CGContextFillPath(context);
}
...
В основном ограничения, которые я реализовал, следующие:
- вертикально вертикально внутри родительского представления
- центр горизонтально внутри родительского представления
И вот в результате я получаю:
![Circle not centered with Auto Layout]()
Любая помощь будет принята с благодарностью, я размышлял об этом в течение нескольких дней.
Спасибо
Ответы
Ответ 1
Попробуйте добавить ограничение высоты и ширины к вашему кругу. Я даже не мог получить просто квадратный вид боли, чтобы появиться вообще, не добавляя их (используя ваш код, минус материал слоя).
NSLayoutConstraint *heightConstraint =
[NSLayoutConstraint constraintWithItem:circle_view
attribute:NSLayoutAttributeHeight
relatedBy:NSLayoutRelationEqual
toItem:nil
attribute:NSLayoutAttributeNotAnAttribute
multiplier:1.0
constant:100.0];
[circle_view addConstraint:heightConstraint];
NSLayoutConstraint *widthConstraint =
[NSLayoutConstraint constraintWithItem:circle_view
attribute:NSLayoutAttributeWidth
relatedBy:NSLayoutRelationEqual
toItem:nil
attribute:NSLayoutAttributeNotAnAttribute
multiplier:1.0
constant:100.0];
[circle_view addConstraint:widthConstraint];
Ответ 2
Просто добавьте к rdelmar ответ:
Основная проблема заключается в том, что как только вы перейдете маршрут NSLayoutConstraint
и укажите setTranslatesAutoresizingMaskIntoConstraints:NO
, кадр, который вы сделали с помощью CGRectMake
, не имеет значения для целей AutoLayout. Поэтому он не использовал информацию с высоты и ширины рамки.