2015-02-28 5 views
10

Я пытаюсь создать табличный вид программно, у которого есть панель поиска в таблицеHeaderView. По какой-то причине строка поиска появляется поверх первой ячейки.tableHeaderView сверху первой ячейки

Я использую масонство для создания ограничений.

Может кто-то указать мне на то, что я делаю неправильно.

- (void)setupViews { 

... 
    self.tableView = [[UITableView alloc] initWithFrame:CGRectZero]; 
    [self.view addSubview:self.tableView]; 

    self.searchBar = [[UISearchBar alloc] initWithFrame:CGRectZero]; 
    self.tableView.tableHeaderView = self.searchBar; 
... 
} 

- (void)updateViewConstraints { 

    [self.searchBar mas_updateConstraints:^(MASConstraintMaker *make) { 
     make.width.equalTo(self.view); 
     make.height.equalTo(@(44)); 
    }]; 

    [self.tableView mas_updateConstraints:^(MASConstraintMaker *make) { 
     make.self.top.equalTo(self.view); 
     make.self.bottom.equalTo(self.toolbar.mas_top); 
     make.width.equalTo(self.view); 
    }]; 
... 
} 

Problem

Здесь можно увидеть, что заголовок находится на том же уровне, что и клетки. View hierarchy

+3

Ницца. +1 для визуального – picciano

+0

Сначала проверьте позицию Y в таблице. Может быть, ваш TableView Header находится за вашей панелью навигации. И проверить заголовок фактически создан или нет? –

+0

Я сделал небольшое видео, чтобы вы могли видеть, что табличное представление не находится за панель навигации. https://www.youtube.com/watch?v=gzsdY4a_qnM&feature=youtube_gdata_player&app=desktop –

ответ

6

Спасибо за вашу помощь, я нашел суть на GitHub, который говорил об изменении размера tableViewHeader с помощью AutoLayout:

https://gist.github.com/andreacremaschi/833829c80367d751cb83

- (void) sizeHeaderToFit { 
    UIView *headerView = self.tableHeaderView; 

    [headerView setNeedsLayout]; 
    [headerView layoutIfNeeded]; 
    CGFloat height = [headerView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height; 

    headerView.frame = ({ 
     CGRect headerFrame = headerView.frame; 
     headerFrame.size.height = height; 
     headerFrame; 
    }); 

    self.tableHeaderView = headerView; 
} 

Если я называю этот метод во время updateViewConstraints затем он работает.

Однако я не совсем понимаю это.

+0

Пожалуйста, напишите как ответ на вопрос – chr

+0

Почему downvote? –

+1

self.tableHeaderView = headerView; является ключевым. Если вы не назовете это, даже если высота таблицыHeaderView изменится, представление таблицы не изменит положение, содержащее ячейки. Это приводит к отображению ячеек за пределами заголовка. – CedricSoubrie

0

Здесь вопрос о пространстве между табличным представлением Заголовок и вид таблицы Ячейка. Вы можете обращаться с помощью Attribute Inspector. Пожалуйста, просмотрите это. - выберите UITableView - Под инспектором атрибутов -> Размер прокрутки -> Вставки содержимого, установите Top = 44 (или в зависимости от того, какая высота вашего навигационного бара).

Или вы можете обращаться с программным обеспечением.

- (void)viewDidLoad { 
     UIEdgeInsets inset = UIEdgeInsetsMake(20, 0, 0, 0); 
     self.tableView.contentInset = inset; 
    } 
+0

Я создаю представления программно, поэтому IB не является опцией –

0

Я думаю, что проблема в том, что вы используете autolayout и настройка кадры просмотров вручную заменить этот код:

self.tableView = [[UITableView alloc] initWithFrame:CGRectZero]; 
[self.view addSubview:self.tableView]; 

self.searchBar = [[UISearchBar alloc] initWithFrame:CGRectZero]; 
self.tableView.tableHeaderView = self.searchBar; 

с чем-то вроде этого:

self.tableView = [UITableView new]; 
self.tableView.translatesAutoresizingMasksIntoConstraints = NO; 
[self.view addSubview:self.tableView]; 

self.searchBar = [UISearchBar new]; 
self.searchBar.translatesAutoresizingMasksIntoConstraints = NO; 
self.tableView.tableHeaderView = self.searchBar; 

Это не может потому что возможно searchBar's кадр должен быть установлен вручную без ограничений.

4

Использование расширений в Swift 3.0

extension UITableView { 

    func setTableHeaderView(headerView: UIView?) { 
     // set the headerView 
     tableHeaderView = headerView 

     // check if the passed view is nil 
     guard let headerView = headerView else { return } 

     // check if the tableHeaderView superview view is nil just to avoid 
     // to use the force unwrapping later. In case it fail something really 
     // wrong happened 
     guard let tableHeaderViewSuperview = tableHeaderView?.superview else { 
      assertionFailure("This should not be reached!") 
      return 
     } 

     // force updated layout 
     headerView.setNeedsLayout() 
     headerView.layoutIfNeeded() 

     // set tableHeaderView width 
     tableHeaderViewSuperview.addConstraint(headerView.widthAnchor.constraint(equalTo: tableHeaderViewSuperview.widthAnchor, multiplier: 1.0)) 

     // set tableHeaderView height 
     let height = headerView.systemLayoutSizeFitting(UILayoutFittingCompressedSize).height 
     tableHeaderViewSuperview.addConstraint(headerView.heightAnchor.constraint(equalToConstant: height)) 
    } 

    func setTableFooterView(footerView: UIView?) { 
     // set the footerView 
     tableFooterView = footerView 

     // check if the passed view is nil 
     guard let footerView = footerView else { return } 

     // check if the tableFooterView superview view is nil just to avoid 
     // to use the force unwrapping later. In case it fail something really 
     // wrong happened 
     guard let tableFooterViewSuperview = tableFooterView?.superview else { 
      assertionFailure("This should not be reached!") 
      return 
     } 

     // force updated layout 
     footerView.setNeedsLayout() 
     footerView.layoutIfNeeded() 

     // set tableFooterView width 
     tableFooterViewSuperview.addConstraint(footerView.widthAnchor.constraint(equalTo: tableFooterViewSuperview.widthAnchor, multiplier: 1.0)) 

     // set tableFooterView height 
     let height = footerView.systemLayoutSizeFitting(UILayoutFittingCompressedSize).height 
     tableFooterViewSuperview.addConstraint(footerView.heightAnchor.constraint(equalToConstant: height)) 
    } 
} 
Смежные вопросы