Вопрос по ios, cocoa-touch, uiview, calayer, autolayout – Центрируйте пользовательский UIView по вертикали и горизонтали, используя Auto Layout

30

пытаюсь создать довольно простой анимированный пользовательский интерфейс с помощью API Auto Layout, недавно появившегося в iOS 6. Пользовательский вид I 'В здании есть круг, который я хочу расположить как вертикально, так и горизонтально.

К сожалению, я не могуНе могу понять, почему мои ограничения работают нормально для элементов UIButton и UILabel, но дают странные результаты, когда я использую пользовательское представление и пользовательский CALayer (в данном случае круг, который в конечном итоге будет анимирован).

Чтобы быть ясно, я нене хочу, чтобы мой взгляд расширялся, чтобы заполнить весь экран, а скорее чтобы иметь динамику "обивка» так что вид на iPhone 4 и 5 вертикально центрирован. Я должен также отметить, чтоЯ очень новичок в Какао и 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);
}
...

В основном ограничения, которые яреализованы:

центр вертикально внутри родительского видацентрировать горизонтально внутри родительского вида

И вот результат, который я получаю:

Любая помощь будет принята с благодарностью, яЯ обдумывал это уже несколько дней.

Спасибо

Ваш Ответ

2   ответа
11

Основная проблема заключается в том, что, как только вы идетеNSLayoutConstraint маршрут и укажитеsetTranslatesAutoresizingMaskIntoConstraints:NO, кадр, который вы сделали сCGRectMake представляется несоответствующим для целей AutoLayout. Тот'почему это не такиспользовать информацию из фреймаВысота и ширина.

этот ответ решил мою проблему. Даже если фрейм указан с помощью initWithFrame: constructor, он немедленно становится недействительным при вызове etTranslatesAutoresizingMaskIntoConstraints: NO Chris
34

е могЯ даже не вижу ничего похожего на квадраты боли, не добавляя их (используя ваш код, за исключением материала слоя).

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];
Спасибо! Это именно то, что я хочу. Нет больше двусмысленных предупреждений макета. :) phor2
Мне потребовалось некоторое время, пока я не понял, что этот код является дополнением к коду из приведенного выше вопроса. Спасибо, парни! Mihail Velikov

Похожие вопросы