3

Когда мой вид таблицы пуст, я хочу добавить простую метку в нижний колонтитул таблицы, чтобы отобразить сообщение «без содержимого». Он отлично работал, когда я устанавливал рамки UILabel и UIView, которые я использовал для footerView, но теперь я пытаюсь преобразовать их в использование автоматического макета, и я не могу заставить его работать.Установка метки в таблицу UITableView tableFooterView - с автозапуском

Вот что я делаю:

// Create the footer  
UIView *tempFooter = [[UIView alloc] init]; 
UILabel *atext = [[UILabel alloc] init]; 
tempFooter.translatesAutoresizingMaskIntoConstraints = NO; 
atext.translatesAutoresizingMaskIntoConstraints = NO; 

atext.numberOfLines = 0; 
[atext setText:@"Add Some Text"]; 
atext.textAlignment = NSTextAlignmentCenter; 
atext.font = [UIFont italicSystemFontOfSize:14]; 
atext.textColor = [UIColor grayColor]; 
atext.backgroundColor = [UIColor clearColor]; 
atext.lineBreakMode = NSLineBreakByWordWrapping; 

// add label to footer view, and add constraints 
[tempFooter addSubview:atext]; 
NSLayoutConstraint *tvatt1 = [NSLayoutConstraint constraintWithItem:tempFooter 
                  attribute:NSLayoutAttributeLeft 
                  relatedBy:NSLayoutRelationEqual 
                  toItem:atext attribute:NSLayoutAttributeLeft 
                 multiplier:1.0 
                  constant:10.0]; 

NSLayoutConstraint *tvatt2 = [NSLayoutConstraint constraintWithItem:tempFooter 
                  attribute:NSLayoutAttributeRight 
                  relatedBy:NSLayoutRelationEqual 
                  toItem:atext 
                  attribute:NSLayoutAttributeRight 
                 multiplier:1.0 
                  constant:10.0]; 

NSLayoutConstraint *tvatt3 = [NSLayoutConstraint constraintWithItem:tempFooter 
                  attribute:NSLayoutAttributeTop 
                  relatedBy:NSLayoutRelationEqual 
                  toItem:atext 
                  attribute:NSLayoutAttributeTop 
                 multiplier:5.0 
                  constant:0]; 

NSLayoutConstraint *tvatt4 = [NSLayoutConstraint constraintWithItem:tempFooter 
                  attribute:NSLayoutAttributeBottom 
                  relatedBy:NSLayoutRelationEqual 
                  toItem:atext 
                  attribute:NSLayoutAttributeBottom 
                 multiplier:1.0 
                  constant: 0]; 

[tempFooter addConstraints: @[tvatt1, tvatt2, tvatt3, tvatt4]]; 


// set the footerview 
self.tview.tableFooterView = tempFooter; 

Когда я запускаю это, я получаю аварии:

2014-09-08 19: 57: 16,594 SimpleList [49442: 60b] * отказ Утверждения в - [UITableView layoutSublayersOfLayer:], /SourceCache/UIKit_Sim/UIKit-2935.137/UIView.m:8794 2014-09-08 19: 57: 21,073 SimpleList [49442: 60b] * Согласующего приложение из-за uncaught исключение 'NSInternalInconsistency Исключение ", причина: 'Автоматическая компоновка по-прежнему требуется после выполнения -layoutSubviews. реализация UITableView о -layoutSubviews нужно вызвать супер

Я не уверен, что я делаю неправильно. Я также попробовал установить ограничения для self.tview.tableFooterView по адресу tempFooter (закрепление на всех четырех сторонах), но это не изменит крушение. Я также звоню:

[self.tview.tableFooterView layoutSubviews]; 

, но это тоже не помогает.

Любые идеи, что я делаю неправильно?

+0

Попробуйте закомментировать строку, tempFooter.translatesAutoresizingMaskIntoConstraints = NO; и посмотреть, устраняет ли это проблему. – rdelmar

+0

Нет, к сожалению, приводит к другому сбою: 2014-09-08 22: 46: 19.905 Невозможно одновременно удовлетворить ограничения. Вероятно, хотя бы одно из ограничений в следующем списке - это то, которое вы не хотите .... ( "", " " ) –

+0

Эта новая ошибка вызвана отсутствием высоты, установленной для представления нижнего колонтитула (так что это будет 0), но с ограничениями на сверху и снизу, для метки, которая имеет ненулевую высоту. См. Мой ответ. – rdelmar

ответ

10

Вы не должны устанавливать translatesAutoresizingMaskIntoConstraints в NO для представлений таблиц, их ячеек или представлений заголовка таблицы и нижнего колонтитула (или для собственного зрения вашего контроллера). Можно использовать ограничения для представлений внутри этих представлений (представление содержимого ячеек или представления заголовка и нижнего колонтитула). Я добавил упрощенную версию вашего кода в viewDidLoad, и он работал, как ожидалось. Обратите внимание, что вам нужно, чтобы дать представление колонтитула высоту и положение х (положение у и ширина игнорируется),

UIView *tempFooter = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 50)]; 
    UILabel *atext = [[UILabel alloc] init]; 
    atext.translatesAutoresizingMaskIntoConstraints = NO; 
    atext.numberOfLines = 0; 
    [atext setText:@"Add Some Text"]; 
    atext.textAlignment = NSTextAlignmentCenter; 
    atext.font = [UIFont italicSystemFontOfSize:14]; 
    atext.textColor = [UIColor grayColor]; 
    atext.backgroundColor = [UIColor clearColor]; 
    atext.lineBreakMode = NSLineBreakByWordWrapping; 

    [tempFooter addSubview:atext]; 
    NSDictionary *dict = NSDictionaryOfVariableBindings(atext); 
    [tempFooter addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|-10-[atext]-10-|" options:0 metrics:nil views:dict]]; 
    [tempFooter addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[atext]|" options:0 metrics:nil views:dict]]; 
    self.tableView.tableFooterView = tempFooter; 

Я не уверен, что вы пытаетесь достичь с ограничением, tvatt3. Умножитель (у вас 5) не делает ничего с верхним или левым ограничением, так как значение этих атрибутов равно 0. Я использовал визуальные ограничения, а не метод, который вы использовали, но когда я использовал ваш код для добавления ограничений , он тоже работал.

+0

Спасибо. Множитель на 5 - это опечатка (она должна быть 1). Это, похоже, работает, но есть большая проблема, это то, что высота фиксирована на 50. Как настроить высоту заголовка, если текст намного длиннее? например попробуйте с этим: '[atext setText: @" Добавить некоторый текст. Теперь добавьте намного больше текста с новыми строками, добавленными для хорошей оценки. Это работает за пределами определенной высоты? \ n \ nНо как вы вычисляете высоту? "] ; «Полный нижний колонтитул больше не отображается. Я попытался использовать '[atext systemLayoutSizeFittingSize: UILayoutFittingExpandedSize]', чтобы установить кадр для нижнего колонтитула перед его настройкой, но он сбой –

+0

Я думаю, что у меня это работает; Я установил footerView в 'viewWillLayoutSubviews' и установил высоту нижнего колонтитула, используя' systemLayoutSizeFittingSize: '. Единственная проблема: получение сообщения «Невозможно одновременно удовлетворить ограничения» в отладчике. Это выглядит подозрительно, но не знаю, как это получилось: «« –

+1

Выяснил это: визуальное ограничение для закрепления метка горизонтально не работает. Я удалил это и добавил ограничение центрирования с ограничениемWithItem между меткой и tempFooter (с NSLayoutAttributeCenterX), и он работает! –

0

надеюсь, что это поможет вам

Я не уверен в этом, но это поможет мне в моем проекте, сначала добавьте каждую вещь в contentView (все подвид и ограничение)

[self.contentView addSubview:atext] 

, а затем приходит к части кода

NSLayoutConstraint *tvatt1 = [NSLayoutConstraint constraintWithItem:tempFooter 
                  attribute:NSLayoutAttributeLeft 
                  relatedBy:NSLayoutRelationEqual 
                  toItem:atext attribute:NSLayoutAttributeLeft 
                 multiplier:1.0 
                  constant:10.0]; 

код говоря для левого атрибута

temfooter(must be equal) = 1.0*atext +10.0 

i.e temfooter должен быть равен модифицированному atext, поэтому вам необходимо убедиться, что ваши ограничения не являются ошибочными.

+0

Спасибо, но вопрос скорее о tableFooterView UITableView. Общий прецедент добавления представления в другой UIView достаточно прост. –

+2

@ZS исследуйте эту ссылку (http://constraints.icodeforlove.com/), возможно, это поможет вам каким-то образом. –

1

Интересно, что изменение маски Autoresizing в xib решило мою проблему.

Ограничения не работает:

Not working

работы:

Working

0

Я был в состоянии сделать динамически автоматический сервировки ширину и высоту нижнего колонтитула путем внедрения @rdelmar решения для ограничений и добавления эти строки ниже. Такое же решение применяется к представлению заголовка таблицы.

override func viewDidLayoutSubviews() { 
    super.viewDidLayoutSubviews() 
    if let tableFooter = tableView.tableFooterView { 
     let maxSize = CGSize(width: self.tableView.bounds.size.width, 
          height: CGFloat.greatestFiniteMagnitude) 
     let size = tableFooter.systemLayoutSizeFitting(maxSize) 
     let height = size.height 
     var headerFrame = tableFooter.frame 

     // If we don't have this check, viewDidLayoutSubviews() will get 
     // repeatedly, causing the app to hang. 
     if height != headerFrame.size.height { 
      headerFrame.size.height = height 
      tableFooter.frame = headerFrame 
      tableView.tableFooterView = tableFooter 
     } 
    } 
} 

P. S. Я предпочитаю Interface Builder для настройки ограничений enter image description here

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