Подтвердить что ты не робот

UIView в XIB с использованием Autolayout всегда 600x600

Я создал отдельный .xib, потому что я хотел создать UIView с autolayout вне viewController. Я создал .xib, добавил UIView и ограничения, используя wCompact hRegular. Простой.

enter image description here

Затем добавьте его в мой viewController в viewDidLoad:

UIView *header = [[[NSBundle mainBundle] loadNibNamed:@"HeaderSearch" owner:self options:nil] lastObject];
NSLog(@"%@", NSStringFromCGRect(header.frame));
[self.view addSubview:header];

Но когда он добавляется, размер кадра составляет 600x600, и я не могу понять, почему.

Что я сделал неправильно здесь, что заставляет этот странный размер?

4b9b3361

Ответ 1

Вам нужно снять флажок "Использовать классы размера" в xib

uncheck size classes

и размер кадра представления будет тем, который вы установили, а не 600x600

Ответ 2

Пожалуйста, обратитесь к этому.

header.translatesAutoresizingMaskIntoConstraints = NO;
[self.view addSubview:header];

NSLayoutConstraint *widthConstraint = [NSLayoutConstraint constraintWithItem:self.view attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:header attribute:NSLayoutAttributeWidth multiplier:1.0 constant:0];
[self.view addConstraint:widthConstraint];

NSLayoutConstraint *heightConstraint = [NSLayoutConstraint constraintWithItem:header attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:130.0];
[self.view addConstraint:widthConstraint];
[self.view addConstraint:heightConstraint];

Ответ 3

Если это Xcode 8, отключите "Использовать вариации признаков"

введите описание изображения здесь

Ответ 4

У меня была аналогичная проблема, но в моем случае мне не нравилось отключать вариации признаков или классы размеров. Я также загружаю некоторые виды из XIB, но я использую эту удобную вспомогательную категорию:

@implementation UIView (Initialization)

+ (instancetype)instantiateFromNib {
    return [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass(self.class) owner:nil options:nil] firstObject];
}

@end

Я не хотел вводить ограничения, написанные в коде, поэтому добавил метод overriden viewWillLayoutSubviews к моему контроллеру вида, например:

- (void)viewWillLayoutSubviews {
    [super viewWillLayoutSubviews];
    [self.firstView setFrame:self.view.bounds];
    [self.secondView setFrame:self.view.bounds];
}

В моем случае firstView и secondView являются просто наложением на весь контроллер представления.