2015-06-27 3 views
0

Быстро стучал в это на пару дней сейчас. Проблема в том, что когда я использую ограничения автоопределения и выравниваю представление на правом краю UITableViewCell, представление исчезает. Ниже приведен код, который воспроизводит проблему, но я пробовал много других вещей, таких как различные «needsLayout», «needsUpdateContraints» и т. Д. В разных местах, а также их соответствующие «updateLayoutIfNeeded» звонки повсюду. Я также попытался переопределить «updateConstraints» и добавить туда ограничения. Но я получаю точно такие же результаты независимо от того, что я делаю.Пользовательский вид UITableViewCell исчезает автоклассически вправо

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ 
    return 2; 
} 

-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 
    NSString* [email protected]"Simple"; 
    UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:SimpleIdentifier]; 
tableView.translatesAutoresizingMaskIntoConstraints=NO; 

    UILabel* label1; 
    UILabel* label2; 

    if(cell==nil){ 
     cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:SimpleIdentifier]; 

     label1=[[UILabel alloc]initWithFrame:CGRectMake(0, 0, 100, 50)]; 
     label1.tag=100; 
     label1.translatesAutoresizingMaskIntoConstraints=NO; 
     [cell.contentView addSubview:label1]; 

     label2=[[UILabel alloc]initWithFrame:CGRectMake(100, 0, 100, 50)]; 
     label2.tag=101; 
     label2.translatesAutoresizingMaskIntoConstraints=NO; 
     [cell.contentView addSubview:label2]; 

     NSDictionary* [email protected]{@"label1":label1,@"label2":label2}; 
     [cell.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[label1]" options:NSLayoutFormatAlignAllTop metrics:nil views:viewsDictionary]]; 
     [cell.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[label2]|" options:NSLayoutFormatAlignAllTop metrics:nil views:viewsDictionary]]; 
     //[cell.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[label1]-[label2]" options:NSLayoutFormatAlignAllTop metrics:nil views:viewsDictionary]]; 
    } else { 
     label1=(UILabel*)[cell.contentView viewWithTag:100]; 
     label1=(UILabel*)[cell.contentView viewWithTag:101]; 
    } 

    [email protected]"Label 1"; 
    [email protected]"Label 2"; 

    return cell; 
} 
+1

вопросы Автокомпоновка хитры. Я вижу, что кто-то отправил ответ, но, в общем, вам нужно использовать отладчик вида для просмотра ограничений во время выполнения. Это покажет вам, что вы делаете неправильно, и это лучший подход, чем случайный код в разных методах. В WWDC 2015 были также два видео (# 218 и # 219 Mysteries of AutoLayout Part 1 и 2), которые позволяют вам отлаживать проблемы автозапуска. Их можно скачать бесплатно с Apple: https://developer.apple.com/videos/wwdc/2015/ –

+0

Спасибо, это оказалось чем-то глупо простым (см. Комментарий ниже). Я просмотрю эти видео. –

ответ

1
-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 
NSString* [email protected]"Simple"; 
UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:SimpleIdentifier]; 

UILabel* label1; 
UILabel* label2; 

if(cell==nil){ 
    cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:SimpleIdentifier]; 

    label1=[[UILabel alloc]initWithFrame:CGRectMake(0, 0, 100, 50)]; 
    label1.tag=100; 
    label1.translatesAutoresizingMaskIntoConstraints=NO; 
    [cell.contentView addSubview:label1]; 

    label2=[[UILabel alloc]initWithFrame:CGRectMake(100, 0, 100, 50)]; 
    label2.tag=101; 
    label2.translatesAutoresizingMaskIntoConstraints=NO; 
    [cell.contentView addSubview:label2]; 

    NSDictionary* [email protected]{@"label1":label1,@"label2":label2}; 
    [cell.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[label1]" options:NSLayoutFormatAlignAllTop metrics:nil views:viewsDictionary]]; 
    [cell.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[label2]|" options:NSLayoutFormatAlignAllTop metrics:nil views:viewsDictionary]]; 
    [cell.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[label1]|" options:0 metrics:nil views:viewsDictionary]]; 
     [cell.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[label2]|" options:0 metrics:nil views:viewsDictionary]]; 

} else { 
    label1=(UILabel*)[cell.contentView viewWithTag:100]; 
    label1=(UILabel*)[cell.contentView viewWithTag:101]; 
} 

[email protected]"Label 1"; 
[email protected]"Label 2"; 

return cell; 

}

И скриншот enter image description here

+0

По внешнему виду вы добавили два вертикальных ограничения. Это не решило мою проблему, но зная, что это сработало для вас с экрана, действительно помогло. Оказывается (похлопывание по лбу) У меня не было ограничений макета на моем UITableView, и фактическая таблица бегала со стороны экрана. Он работает и без ваших рекомендуемых изменений. Престижность скриншота, вот что заставило меня задуматься о чем-то другом, кроме моего кода. –