Ответ 1
Вам нужно снять флажок "Использовать классы размера" в xib
и размер кадра представления будет тем, который вы установили, а не 600x600
Я создал отдельный .xib, потому что я хотел создать UIView
с autolayout
вне viewController. Я создал .xib, добавил UIView
и ограничения, используя wCompact hRegular
. Простой.
Затем добавьте его в мой viewController
в viewDidLoad
:
UIView *header = [[[NSBundle mainBundle] loadNibNamed:@"HeaderSearch" owner:self options:nil] lastObject];
NSLog(@"%@", NSStringFromCGRect(header.frame));
[self.view addSubview:header];
Но когда он добавляется, размер кадра составляет 600x600, и я не могу понять, почему.
Что я сделал неправильно здесь, что заставляет этот странный размер?
Вам нужно снять флажок "Использовать классы размера" в xib
и размер кадра представления будет тем, который вы установили, а не 600x600
Пожалуйста, обратитесь к этому.
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];
Если это Xcode 8, отключите "Использовать вариации признаков"
У меня была аналогичная проблема, но в моем случае мне не нравилось отключать вариации признаков или классы размеров. Я также загружаю некоторые виды из 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
являются просто наложением на весь контроллер представления.