2013-07-14 20 views
1

Я должен добавить некоторые ограничения программным образом в настраиваемом UITableViewCell, у меня есть mainView (красный), он будет контейнером (subView of cell.contentView), изображением и двумя другими областями mainView.Autolayout программно не работает

это то, что я хочу иметь (синие и желтые точки зрения не имеют одинаковую высоту, но это другой вопрос):

enter image description here

с помощью кода, приведенную ниже (я не добавив ImageView еще), у меня есть это:

enter image description here

, как вы можете увидеть 2 подвиды имеют одинаковый размер, и когда я прокрутки, иногда отображается синий вид и иногда это желтый один.

код:

self.mainView = [[UIView alloc]init]; 
[self.mainView setBackgroundColor:[UIColor redColor]]; 
[self.mainView setTranslatesAutoresizingMaskIntoConstraints:NO]; 
[self.contentView addSubview:self.mainView]; 

UIView *blueView = [[UIView alloc]init]; 
[blueView setTranslatesAutoresizingMaskIntoConstraints:NO]; 
[blueView setBackgroundColor:[UIColor blueColor]]; 
[self.mainView addSubview:blueView]; 

UIView *yelloView = [[UIView alloc]init]; 
[yelloView setBackgroundColor:[UIColor yellowColor]]; 
[yelloView setTranslatesAutoresizingMaskIntoConstraints:NO]; 
[self.mainView addSubview:yelloView]; 
NSDictionary *views = NSDictionaryOfVariableBindings(blueView,yelloView,mainView); 

NSMutableArray *results = [NSMutableArray array]; 
NSString *mainContentView_CVF_H = @"H:|-[blueView]-|"; 
NSString *mainContentView_CVF_V = @"V:|-[blueView]"; 
NSArray *mainContentViewConstaints_H = [NSLayoutConstraint constraintsWithVisualFormat:mainContentView_CVF_H options:0 metrics:nil views:views]; 
NSArray *mainContentViewConstaints_V = [NSLayoutConstraint constraintsWithVisualFormat:mainContentView_CVF_V options:0 metrics:nil views:views]; 
[results addObjectsFromArray:mainContentViewConstaints_H]; 
[results addObjectsFromArray:mainContentViewConstaints_V]; 

NSString *delivelyView_CVF_H = @"H:|-[yelloView]-|"; 
NSString *delivelyView_CVF_V = @"V:[blueView][yelloView]-|"; 
NSArray *delivelyViewConstaints_H = [NSLayoutConstraint constraintsWithVisualFormat:delivelyView_CVF_H options:0 metrics:nil views:views]; 
NSArray *delivelyViewConstaints_V = [NSLayoutConstraint constraintsWithVisualFormat:delivelyView_CVF_V options:0 metrics:nil views:views]; 
[results addObjectsFromArray:delivelyViewConstaints_H]; 
[results addObjectsFromArray:delivelyViewConstaints_V]; 

[self.mainView addConstraints:results]; 


NSString *mainView_CVF_H = @"H:|-[mainView]-|"; 
NSString *mainView_CVF_V = @"V:|-[mainView]-|"; 
results = [NSMutableArray array]; 
NSArray *mainViewConstaints_H = [NSLayoutConstraint constraintsWithVisualFormat:mainView_CVF_H options:0 metrics:nil views:views]; 
NSArray *mainViewConstaints_V = [NSLayoutConstraint constraintsWithVisualFormat:mainView_CVF_V options:0 metrics:nil views:views]; 
[results addObjectsFromArray:mainViewConstaints_H]; 
[results addObjectsFromArray:mainViewConstaints_V]; 

[self.contentView addConstraints:results]; 

я заменить подвидов (синий и желтый) с 2 текстом поданной без каких-либо изменений, и они отображаются, как ожидалось.

2 вопросы:

  • вы можете помочь :)?

  • Важное значение имеет порядок добавления ограничений?

+0

Зачем вам нужно добавлять ограничения в код? Есть ли причина, по которой вы не можете сделать это в IB? – rdelmar

+0

Мне нужно использовать код, потому что содержимое ячейки будет очень динамичным. –

+0

Это не обязательно означает, что вы должны делать это в коде (или все в коде в любом случае). Я часто делаю ячейки с текстовыми представлениями, ярлыками и/или изображениями, которые могут иметь переменный размер в зависимости от их содержимого. Сила ограничений заключается в том, что вы можете настроить их в IB таким образом, чтобы они позволяли элементам UI изменять размер, как вы хотите. Если вы еще этого не сделали, вы должны проверить 3 видео на WWDC 2012 по этому вопросу. – rdelmar

ответ

3

Пара мыслей:

  1. Нет, порядок ограничений не имеет значения.

  2. Как и в стороне, вы могли бы объединить два из вашего вертикального ограничения УНЧЕЙ в одно:

    @"V:|-[blueView][yellowView]-|" 
    
  3. Причина странных высоты blueView и yellowView является то, что ваши ограничения неоднозначны. Вы определяете, что синие и желтые вместе должны охватывать высоту их общего наблюдения, но вы оставляете его в iOS, чтобы точно определить, насколько высок каждый из них будет индивидуально. Эта неопределенность может быть подтверждено, запустив приложение в отладчик, приостановив приложение после того, как приложение завершило представление этого определенный набор представлений, а затем в (lldb) строке можно ввести:

    po [[UIWindow keyWindow] _autolayoutTrace] 
    

    Вы, вероятно, увидеть результаты, которые говорят что-то вроде этого упрощенного примера:

    $0 = 0x075667b0 
    *<UIWindow:0x718a760> 
    | *<UIView:0x718d090> 
    | | *<UIView:0x7562490> 
    | | | *<UIView:0x75627d0> - AMBIGUOUS LAYOUT 
    | | | *<UIView:0x7562880> - AMBIGUOUS LAYOUT 
    

    Итог, вы должны решить эту двусмысленность.Если вы хотите им одинаковую высоту (я знаю, что вы этого не сделаете, но только в качестве примера), вы можете сделать:

    @"V:|-[blueView][yellowView(==blueView)]-|" 
    

    Или, если вы хотите сказать, что blueView должно быть 44 точек, и он должен изменить размер yellowView занять остальное, это было бы:

    @"V:|-[blueView(44)][yellowView]-|" 
    

    Если вы хотите сказать, что blueView должна быть в два раза выше yellowView, вы можете сделать это, тоже, но не с ЛВЖ:

    [mainView addConstraint:[NSLayoutConstraint constraintWithItem:blueView 
                    attribute:NSLayoutAttributeHeight 
                    relatedBy:NSLayoutRelationEqual 
                     toItem:yellowView 
                    attribute:NSLayoutAttributeHeight 
                    multiplier:2.0 
                     constant:0.0]]; 
    

    Но нижняя строка, если вы не согласны с тем, что iOS делает синюю и желтую любую старую случайную высоту (включая создание одной нулевой высоты, а другая занимает остальную часть пространства), вам нужны некоторые ограничения, чтобы указать некоторые правила о том, как высокий они должны быть такими.

  4. Причина, по которой она работает при замене синего и желтого изображений на элементы управления UILabel, заключается в том, что метки имеют внутреннее ограничение по высоте, которое сделает их отличными от нуля, что означает, что вы одновременно увидите оба вида , Но с помощью простых элементов управления UIView нет минимальной минимальной высоты, поэтому можно сделать либо синий, либо желтый размер любого размера, который он хочет удовлетворить вашим ограничениям, в том числе сделать ту или иную нулевую высоту.

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

+0

@rdelmar Только после того, как я обновил свой ответ с помощью пункта №4, я увидел ваш комментарий, который фактически является тем же самым. Вы совершенно правы. – Rob

+0

То же самое здесь - я видел ваше обновление сразу после того, как я разместил его, поэтому я удалил свою. – rdelmar

+0

спасибо, я просто хочу добавить размер, как вы предлагаете. –

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