У меня есть следующая проблема: Я создал пользовательский класс UIView
и его расположение в файле XIB
. Предположим, что размер моего пользовательского представления в XIB составляет 150 x 50. Я включил sizeClasses
(wAny hAny) и AutoLayout
. В моделируемых показателях я установил Size = Freeform
, Status Bar = None
, все other = Inferred
.Программно изменить размер пользовательского UIView из XIB
код из моего класса пользовательского UIView
выглядит следующим образом:
#import "CustomView.h"
@implementation CustomView
#pragma mark - Object lifecycle
- (id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
[self setup];
}
return self;
}
- (id)initWithCoder:(NSCoder *)aDecoder {
self = [super initWithCoder:aDecoder];
if (self) {
[self setup];
}
return self;
}
#pragma mark - Private & helper methods
- (void)setup {
if (self.subviews.count == 0) {
[[NSBundle mainBundle] loadNibNamed:@"CustomView" owner:self options:nil];
self.bounds = self.view.bounds;
[self addSubview:self.view];
}
}
@end
В моих UIViewController
где я хочу, чтобы добавить этот обычай UIView
, я сделал манекен UIView (размер которых я поставил в Interface Builder), где I хочу добавить CustomView
и Я бы хотел, чтобы мой CustomView
соответствовал границам моего вида контейнера.
Я пытаюсь сделать это так:
_vCustomView = [[CustomView alloc] init];
_vCustomView.translatesAutoresizingMaskIntoConstraints = NO;
[_vContainer addSubview:_vCustomView];
[_vContainer addConstraint:[NSLayoutConstraint constraintWithItem:_vCustomView attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:_vContainer attribute:NSLayoutAttributeLeft multiplier:1.0 constant:0.0]];
[_vContainer addConstraint:[NSLayoutConstraint constraintWithItem:_vCustomView attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:_vContainer attribute:NSLayoutAttributeRight multiplier:1.0 constant:0.0]];
[_vContainer addConstraint:[NSLayoutConstraint constraintWithItem:_vCustomView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:_vContainer attribute:NSLayoutAttributeTop multiplier:1.0 constant:0.0]];
[_vContainer addConstraint:[NSLayoutConstraint constraintWithItem:_vCustomView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:_vContainer attribute:NSLayoutAttributeBottom multiplier:1.0 constant:0.0]];
но не повезло. Предположим, что мой контейнерный вид - 300 x 100, когда я добавляю свой пользовательский UIView
, мой пользовательский вид по-прежнему 150 x 50.
Я пытался работать без вида контейнера - добавить мой пользовательский объект UIView
непосредственно self.view моего UIViewController
и установить его ширину и высоту с:
autoLayout
ограничений- с помощью
initWithFrame
когда инициализация моего заказаUIView
но опять же - не повезло. Пользовательский вид всегда 150 х 50.
Может кто-нибудь объяснить мне, как я могу программно добавить мой заказ UIView
сделал в XIB
и изменить его с помощью autoLayout
ограничений?
Большое спасибо заранее.
Edit # 1: Ошибка я получаю при попытке запуска кода Андреа на моей CustomView
Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints)
(
"<NSLayoutConstraint:0x17489b760 V:[UIView:0x17418d820(91)]>",
"<NSLayoutConstraint:0x170c9bf80 V:|-(0)-[CustomView:0x1741da7c0] (Names: '|':CustomView:0x1741da8b0)>",
"<NSLayoutConstraint:0x170c9bfd0 V:[CustomView:0x1741da7c0]-(0)-| (Names: '|':CustomView:0x1741da8b0)>",
"<NSLayoutConstraint:0x170c9be90 V:|-(0)-[CustomView:0x1741da8b0] (Names: '|':UIView:0x17418d820)>",
"<NSLayoutConstraint:0x170c9bee0 CustomView:0x1741da8b0.bottom == UIView:0x17418d820.bottom>",
"<NSAutoresizingMaskLayoutConstraint:0x170c9dba0 h=--& v=--& CustomView:0x1741da7c0.midY == + 25.0>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x170c9bfd0 V:[CustomView:0x1741da7c0]-(0)-| (Names: '|':CustomView:0x1741da8b0)>
Edit # 2: Это работает!
После @Andrea добавил:
view.translatesAutoresizingMaskIntoConstraints = NO;
в его:
- (void) stretchToSuperView:(UIView*) view;
метод, все работает, как я ожидал.
Благодаря @Andrea.
Вы вызываете 'layoutIfNeeded' после внесения изменений в ограничения? Не могли бы вы разместить код, в котором вы измените ширину и высоту? Кроме того, если представление имеет ограничения высоты и ширины в раскадровке, добавление ограничений в 'contentView' приведет к сбою ограничений, поскольку они будут противоречивыми. –
@CatalinaT. Спасибо за ваш ответ. Я не называл layoutIfNeeded, но теперь я попытался с ним, он не вносит никаких изменений. _vContainer - это фиктивный вид, который находится в центре экрана. Моя идея состоит в том, чтобы добавить мой CustomView в это фиктивное представление и что мой CustomView имеет тот же размер, что и фиктивный вид. Вот почему я написал четыре ограничения выше, где я говорю, что мой CustomView должен быть выровнен со всеми четырьмя сторонами фиктивного представления. Косвенно, я устанавливаю ширину и высоту CustomView таким образом. Но, не повезло. CustomView всегда имеет тот же размер, что и XIB (150 x 50). – uerceg