Как применить автомакет для UIView в nib?

Меня смущает авторазметка на xib/nib. Мне удобно использовать автомакет раскадровки.

Я пытаюсь сделать следующее:

1. У меня есть раскадровка с одним контроллером представления и одним UIView, который называется borderView. Он правильно ограничен. Он правильно изменен для iphone 5 и 6. Вот скриншот раскадровки:

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

Это borderView в iphone 5: (я пытаюсь добавить вид nib в качестве подвида к этому пограничному виду)

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

2. Я создал nib с UIView в нем с размерами 300 x 300. Я хочу, чтобы это представление было добавлено в borderVIew в моем ViewController. Вот скриншот для моего пера.

Примечание. Я нигде не устанавливал ограничений по высоте или ширине. Я просто дал ведущую, трассирующую, верхнюю и нижнюю части.

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

и я пытаюсь добавить перо в свой бордюр следующим образом:

Это метод в моем viewController:

   -(void)viewDidAppear:(BOOL)animated{

    [super viewDidAppear:animated];

    [[NSBundle mainBundle] loadNibNamed:@"AlertView" owner:self options:nil];

    [self.borderView addSubview:self.myAlertViewFromNib];

}

и результат в iphone 5:

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

Как видите, представление кончика не выровнено по центру экрана (поскольку представление границы выровнено по центру экрана).

Я понятия не имею, как дать ограничения самому перу. Может ли кто-нибудь сказать мне, возможно ли это сделать в xcode или мне нужно программно указать ограничения?


person Teja Nandamuri    schedule 19.09.2015    source источник


Ответы (3)


Если у вас нет выбора, кроме как сделать это таким образом, попробуйте установить центр вручную. т.е. yourView.frame.x = super.frame.size.width/2 - yourView.frame.size.width/2. Это должно центрировать его по горизонтали. Если это не позволит вам, вам придется добавить ограничения после добавления в подпредставление.

person mskw    schedule 19.09.2015

Вы хотите добавить AlertView как центр, выровненный в контроллере представления. Вместо того, чтобы устанавливать размер из xib, просто создайте идеальное ограниченное представление XIB и определите макросы для размеров, как показано ниже.

Шаг 1 есть несколько макросов для размера

#define kAlertViewWidth 300
#define kAlertViewHeight 300

Шаг 2 в @interface. Пожалуйста, создайте такое свойство в контроллере представления.

@property (nonatomic, retain) IBOutlet UIView *myViewFromNib;

Метод получения для свойства

-(UIView *)myViewFromNib
{
if (!_myViewFromNib) {
    _myViewFromNib = [[[NSBundle mainBundle] loadNibNamed:@"AlertView" owner:self options:nil] objectAtIndex:0];
    _myViewFromNib.translatesAutoresizingMaskIntoConstraints = NO;


}
return _myViewFromNib;
}

//Шаг 3 в методе viewDidLoad

 -(void)viewDidLoad{
  [self setUpConstraints];
}

Метод, который добавит необходимые ограничения

    -(void)setUpConstraints
    {
        \[self.view addSubview:self.myViewFromNib\];
        \[NSLayoutConstraint activateConstraints:@\[\[NSLayoutConstraint constraintWithItem:self.myViewFromNib attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeCenterX multiplier:1.0 constant:0\],

                                                  \[NSLayoutConstraint constraintWithItem:self.myViewFromNib attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeCenterY multiplier:1.0 constant:0\],

                                                  \[NSLayoutConstraint constraintWithItem:self.myViewFromNib attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0
                                                                                constant:kAlertViewWidth\],

                                                  \[NSLayoutConstraint constraintWithItem:self.myViewFromNib attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0
                                                                                constant:kAlertViewHeight\]\]\];
    }
person Mohshin Shah    schedule 13.01.2016

Вместо xib и раскадровки используйте раскадровку, а внутри вашего граничного представления добавьте еще одно представление (со всем, что у вас есть в xib) и ограничьте это представление в своем граничном представлении. Используйте ограничения вертикального центра и горизонтального центра, чтобы центрировать внутренний вид. Если вам нужно изменить ограничения позже, создайте для них выход в заголовочном файле и настройте приоритет. Если вы все еще хотите использовать xib в представлении, попробуйте использовать стороннюю библиотеку, например Masonry, для настройки вашего xib.

person msadoon    schedule 19.09.2015