2013-09-12 2 views
6

Я создал программный контроллер простого вида с помощью двух кнопок на нем. Если я поеду в старую школу и задаю размеры рамки для макета, тогда все будет хорошо. Однако, если я использую ограничения макета для макета, то кнопки отображаются отлично, но они не реагируют на нажатия. Они даже не выделяют. Мой метод loadview приведен ниже в форме, которая не позволяет кнопкам работать. Если код установки кадра раскоментирован, а добавление ограничений добавлено, то кнопки начинают реагировать на нажатия, как ожидалось. Кто-нибудь знает, что происходит? Я хотел бы перевести весь старый жесткий код в моей базе кода, чтобы быть основаны на ограничениях, но, похоже, приходится сталкиваться с первым препятствием.UIButton перестает работать при использовании автоматической компоновки

- (void)loadView { 
    self.view = [UIView new]; 
    self.view.translatesAutoresizingMaskIntoConstraints = NO; 

    self.navigationItem.title = @"Landing Page"; 

    UIButton *buildExercisesButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
    self.buildExercisesButton = buildExercisesButton; 
// buildExercisesButton.frame = CGRectMake(20, 312, 164, 44); 
    self.buildExercisesButton.translatesAutoresizingMaskIntoConstraints = NO; 
    [self.buildExercisesButton setTitle:@"Build Exercises" forState:UIControlStateNormal]; 
    [self.buildExercisesButton addTarget:self action:@selector(buildExercisesButtonPressed) forControlEvents:UIControlEventTouchUpInside]; 
    [self.view addSubview:self.buildExercisesButton]; 

    UIButton *organiseExercisesButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
    self.organiseExercisesButton = organiseExercisesButton; 
// organiseExercisesButton.frame = CGRectMake(192, 312, 164, 44); 
    self.organiseExercisesButton.translatesAutoresizingMaskIntoConstraints = NO; 
    [self.organiseExercisesButton setTitle:@"Organise Exercises" forState:UIControlStateNormal]; 
    [self.organiseExercisesButton addTarget:self action:@selector(organiseExercisesButtonPressed) forControlEvents:UIControlEventTouchUpInside]; 
    [self.view addSubview:self.organiseExercisesButton]; 

    NSDictionary *variables = NSDictionaryOfVariableBindings(buildExercisesButton, organiseExercisesButton); 
    NSArray *constraints = 
      [NSLayoutConstraint constraintsWithVisualFormat:@"|-[buildExercisesButton(organiseExercisesButton)]-[organiseExercisesButton]-|" 
                options:NSLayoutFormatAlignAllTop | NSLayoutFormatAlignAllBottom 
                metrics:nil 
                 views:variables]; 
    [self.view addConstraints:constraints]; 

    constraints = 
      [NSLayoutConstraint constraintsWithVisualFormat:@"V:[buildExercisesButton]-|" 
                options:0 
                metrics:nil 
                 views:variables]; 
    [self.view addConstraints:constraints]; 
} 

In viewDidAppear Я распечатываю рамки кнопок. Они дают странные ценности, которые я не знаю, связано это или нет. На самом деле кнопки отображаются рядом друг с другом в центре экрана.

buildExercisesButton: {{20, -63}, {164, 44}} 
organiseExercisesButton: {{192, -63}, {164, 44}} 
+0

Хм ... когда я скопировал ваш код, он работал хорошо. Мои журналы были: build frame is: {{20, 397}, {136, 44}} организовать фрейм: {{164, 397}, {136, 44}} – rdelmar

ответ

1

Похоже, что проблема была вторая строка:

self.view.translatesAutoresizingMaskIntoConstraints = NO; 

С помощью этой линии вид не полный экран, начиная с верхнего левого угла, как и ожидалось, но началась где-то недалеко от центра. Поэтому, хотя кнопки оказались рядом с центром экрана, они были фактически за пределами содержащего представления. Когда я удалил эту строку, все начало работать.

Я думаю, что я нашел gotcha для translatesAutoresizingMaskIntoConstraints. Хотя вы должны отключить его, чтобы использовать ограничения, то есть только на точных представлениях, которые используют ограничения, а не для содержащего представления, если только он не использует ограничения. В этом случае я отключил translatesAutoresizingMaskIntoConstraints на содержащем представлении, но не должен иметь, поскольку у него не было ограничений для него.

1

Похоже, что кадры UIButton сняты с экрана. События касания зависят от попадания в них не изображений кнопок, поэтому они не реагируют.

Почему вы используете автоматическую компоновку вместо установки кадров?

+0

Да, в этом была проблема. Я написал полное объяснение в качестве другого ответа. Причина, по которой я использую автомат, - это то, что я считаю, что это будущее. Жестко закодированная компоновка была в порядке, когда было только небольшое количество потенциальных размеров и размеров экрана, но не сейчас с широким спектром устройств, плюс iOS 7 и локализация в миксе. Большинство моих представлений объединены программно, так что интерфейс Builder тоже не очень полезен. Поэтому я прилагаю усилия, чтобы преодолеть кривую обучения использованию автоматического макета в коде. –

2

Вам необходимо определить ограничения для представления, которое вы добавляете, или установить свойство translatesAutoresizingMaskIntoConstraints на YES.

+0

Спасибо, Рафаэль, в этом была проблема. –

+0

Не могли бы вы принять ответ? :) –

+1

это решает мою проблему. спасибо –

1

У меня возникает проблема. В моем случае:

self.view 
\- ... 
    \_self.wrapper 
     \_self.button 

Код не работает:

NSDictionary *metrics = @{@"padding":[NSNumber numberWithFloat:kGridPadding]}; 

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[head]-padding-[wrapper]-|" options:0 metrics:metrics views:views]]; 

Причиной является высота «обертки» является 0, хотя кнопка еще visiable. Таким образом, она может быть исправлена ​​путем предоставления достаточной ширины и высоты, как это:

NSDictionary *metrics = @{@"padding":[NSNumber numberWithFloat:kGridPadding], 
          @"screenHeight":[NSNumber numberWithFloat:self.view.bounds.size.height]}; 

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[head]-padding-[wrapper(screenHeight)]-|" options:0 metrics:metrics views:views]]; 

-> лучший способ сделать высота обертки автоматически увеличивается, но я не знаю, как сделать это сейчас?

+0

Если вы используете отладчик вида, вы увидите обертку, о которой говорит Нянлян. Для меня это был вид сверху, на котором была кнопка, которая не реагировала на краны. Он имел высоту 0. Чтобы исправить это, я просто добавил ограничение высоты в вид контейнера кнопки. –

1

Если вы делаете чисто Раскадровка для autolayout, попробуйте увеличить вертикальной Content Приоритет обниматься и Vertical Приоритет Прочность на сжатие:

enter image description here

Смежные вопросы