2015-12-23 2 views
5

Я хотел бы установить UITableView в соответствии с высотой для всего содержимого в виде таблицы.Dynamic UITableView height

Это моя раскадровка

enter image description here

Проблема с этим верхней и нижней ImageView всегда статическая на экране.

enter image description here

есть, предполагают, чтобы быть 10 пунктов в виде таблицы, но только 7 показывает вверх из-за размера экрана ограничения. Я хотел бы показать все 10, прежде чем пользователь сможет увидеть нижний ImageView. (Кстати, все три из взглядов, то есть. Обе взгляды изображения и TableView находится в UIScrollView)

IDEAL

enter image description here

Некоторые другие ограничения, которые я должен работать с, что количество элементов в представлении таблицы является динамическим значением, которое может быть в любом количестве, обычно меньше 10, которое я позже выберу из api. И высота ячейки также динамична в зависимости от содержимого.

Я только начал с простым кодом

class ExampleViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 
     @IBOutlet weak var tableView: UITableView! 

    var items: [String] = [ 
    "Item 01", "Item 02", "Item 03", "Item 04", "Item 05", 
    "Item 06", "Item 07", "Item 08", "Item 09", "Item 10"] 

    override func viewDidLoad() { 
    super.viewDidLoad() 
    self.tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "cell") 
    } 

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return self.items.count; 
    } 

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell:UITableViewCell = self.tableView.dequeueReusableCellWithIdentifier("cell")! as UITableViewCell 
    cell.textLabel?.text = self.items[indexPath.row] 
    return cell 
    } 

} 
+0

Вы пробовали self.items.count * row_height, это даст высоту, основанную на содержании, но вам нужно написать другие условия, чтобы проверить высоту экрана тоже – Smile

+0

Почему бы вам не добавить верхнее и нижнее изображениеView в заголовке и нижний колонтитул стола? – Muneeba

+0

Верхние и нижние колонтитулы на самом деле не работают, потому что верхнее и нижнее изображениеView - это просто представитель представлений. На самом деле это представление с гораздо большим количеством компонентов, ярлыков, изображений и ограничений. – WKL

ответ

2

Вы должны установить IBOutlet в NSLayoutConstraint, который устанавливает tableView высоту (сначала нужно создать ограничение по высоте с любым значением, не имеет значения), а затем ctrl перетащите его в файл класса

enter image description here

Затем в вашем viewWillAppear необходимо вычислить высоту tableView и установить ее.Пример:

var tableViewHeight:CGFloat = 0; 
for (var i = tableView(self.tableView , numberOfRowsInSection: 0) - 1; i>0; i-=1){ 
    tableViewHeight = height + tableView(self.tableView, heightForRowAtIndexPath: NSIndexPath(forRow: i, inSection: 0)) 
} 
tableViewHeightLayout.constant = tableViewHeight 

И это в значительной степени. Это даст вам размер содержимого scrollView и не должно вызывать никаких предупреждений.

1

В этом случае, не сделать вашу нижнюю ячейку статична, сделать его частью представления таблицы и вставить это нижнее изображение в последней строке таблицы, используя view delegate method - insertRowAtIndexPath

1

В этом корпусе добавить нижнее изображениеView (красное) в виде нижнего колонтитула стола.

Чтобы добавить вид колонтитула в UITableView вы можете использовать:

tableViewObj.tableFooterView = footerViewObj; 
1

Вы, вероятно, реализовать вид таблицы размеров внутреннего контента. Пожалуйста, проверьте это answer, чтобы узнать, помогает ли это.

Я помню эту проблему и даже создал пользовательский подкласс UITableView.

#import "IntrinsicTableView.h" 

@implementation IntrinsicTableView 

#pragma mark - UIView 

- (CGSize)intrinsicContentSize 
{ 
    return CGSizeMake(UIViewNoIntrinsicMetric, self.contentSize.height); 
} 

#pragma mark - UITableView 

- (void)endUpdates 
{ 
    [super endUpdates]; 
    [self invalidateIntrinsicContentSize]; 
} 

- (void)reloadData 
{ 
    [super reloadData]; 
    [self invalidateIntrinsicContentSize]; 
} 

- (void)reloadRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation 
{ 
    [super reloadRowsAtIndexPaths:indexPaths withRowAnimation:animation]; 
    [self invalidateIntrinsicContentSize]; 
} 

- (void)reloadSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation 
{ 
    [super reloadSections:sections withRowAnimation:animation]; 
    [self invalidateIntrinsicContentSize]; 
} 

- (void)insertRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation 
{ 
    [super insertRowsAtIndexPaths:indexPaths withRowAnimation:animation]; 
    [self invalidateIntrinsicContentSize]; 
} 

- (void)insertSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation 
{ 
    [super insertSections:sections withRowAnimation:animation]; 
    [self invalidateIntrinsicContentSize]; 
} 

- (void)deleteRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation 
{ 
    [super deleteRowsAtIndexPaths:indexPaths withRowAnimation:animation]; 
    [self invalidateIntrinsicContentSize]; 
} 

- (void)deleteSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation 
{ 
    [super deleteSections:sections withRowAnimation:animation]; 
    [self invalidateIntrinsicContentSize]; 
} 

@end 
1

Попробуйте также

in ViewDidLoad 

self.table.estimatedRowHeight = 44.0 ; 
self.table.rowHeight = UITableViewAutomaticDimension; 

высоту строки по индексу пути

-(float)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ 
return UITableViewAutomaticDimension;} 
4
  1. Подкласса ваш UITableView переопределить intrinsicContentSize быть его contentSize, как это:

    override var intrinsicContentSize: CGSize { 
        return contentSize 
    } 
    
  2. Затем с помощью автоматической высоты строки для таблицы, так viewDidLoad вашей exampleViewController была бы иметь:

    tableView.estimatedRowHeight = 44 
    

    И функция UITableViewDelegate:

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 
        return UITableViewAutomaticDimension 
    } 
    
  3. При получении данных из API и перезагрузить таблицу, просто позвоните:

    tableView.invalidateIntrinsicContentSize() 
    

    Это покажет таблицу, чтобы изменить размер себя такой же размер, как и его содержание (из-за переопределение), и при необходимости перемещайте нижнее изображение.


Если раскадровка выдает ошибку о том, что ваш UIScrollView имеет неоднозначное высоту, потому что нет высоты ограничения на UITableView, выберите UITableView и дать ему пустышку присущий размера в размере инспекторе.

+1

потрясающий! Я действительно не могу поверить, что это не часть iOS. Разве это не обычный случай использования? –

+0

спасибо @MartinMassera! Я согласен, мне потребовалось некоторое время, чтобы понять, как это сделать лучше, но я использовал этот подход несколько раз. Я не хотел подкласса, но я думал, что это все еще чище, а не обновлять ограничения вручную. – Cody

+0

потрясающий! лучшее решение – Mikhail

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