Проблема размера контента для UITableView в UIscrollView - PullRequest
6 голосов
/ 09 января 2012

Я на самом деле создаю UIScrollView с UITableView внутри него с помощью построителя интерфейса. Я установил размер содержимого моего UIScrollView с помощью:

scrollView.contentSize = CGSizeMake(self.view.frame.size.width, self.view.frame.size.height);

и я установил для владельца моего файла значение UIScrollView

Я создал IBOutlet UITableView и установил его в конструкторе интерфейсов.

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

Кто-нибудь знает, как мне сохранить размер содержимого моего табличного представления, который я установил в конструкторе интерфейсов?

Ответы [ 4 ]

12 голосов
/ 09 января 2012

A UITableView является UIScrollView. Очень редко бывает полезно вставить UITableView внутрь UIScrollView.

Если вы действительно этого хотите, вам нужно где-то сделать следующее. Возможно, в вашем UIViewController в таких методах, как viewDidAppear: или где-то после заполнения табличного представления.

// Set the size of your table to be the size of it's contents 
// (since the outer scroll view will handle the scrolling).
CGRect tableFrame = tableView.frame;
tableFrame.size.height = tableView.contentSize.height;
tableFrame.size.width = tableView.contentSize.width; // if you would allow horiz scrolling
tableView.frame = tableFrame;

// Set the content size of your scroll view to be the content size of your 
// table view + whatever else you have in the scroll view.
// For the purposes of this example, I'm assuming the table view is in there alone.
scrollView.contentSize = tableView.contentSize;
1 голос
/ 28 сентября 2015

Пример для динамического управления высотой TableView вместе со ScrollView, работает в Swift:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        // Custom Cell
        let cell:TblPortCell = self.tableList.dequeueReusableCellWithIdentifier("cell") as! TblPortCell

        //tableList is the OutLet for the table
        tableList.sizeToFit()
        // Set the size of the table to be the size of it's contents
        // (since the outer scroll view will handle the scrolling).
        let height = tableList.frame.size.height
        let pos = tableList.frame.origin.y
        let sizeOfContent = height + pos + 130
        //scrollView is the Outlet for the Scroll view
        scrollView.contentSize.height = sizeOfContent
        scrollView.sizeToFit()

        cell.selectionStyle = UITableViewCellSelectionStyle.None
        return cell
    }

Ссылки на:

0 голосов
/ 16 декабря 2016

Вызовите метод ниже несколько раз.Каждый раз, когда вы звоните, будет больше ячеек.

CGRect tableFrame = tableView.frame;
tableFrame.size.height = tableView.contentSize.height;
tableView.frame = tableFrame;

scrollView.contentSize = tableView.contentSize;
0 голосов
/ 22 августа 2012

Если у вас все еще есть проблемы, попробуйте это без необходимости в scrollView.

Поработав с примером DBD некоторое время, я обнаружил, что frame и contentSize, похоже, не в состояниибыть установленными вместе как:

self.tableView.contentSize = CGSizeMake(320, scrollHeight);
self.tableView.frame = CGRectMake(self.tableView.frame.origin.x,44,self.tableView.contentSize.width,self.tableView.contentSize.height);

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

int cellCount = [YOURARRAY count];
CGFloat scrollHeight = cellCount*44+44;//for a cell with height of 44 and adding 44 if you have a toolbar at the bottom

self.tableView.contentSize = CGSizeMake(320, scrollHeight);//you can change the width and or let the .xib control the autoresizing

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad && cellCount < 14)
{
    //here's were you can add more conditions if you're in landscape or portrait, but this handles 14 cells with a heightForHeaderInSection of 46 in landscape
    self.tableView.frame = CGRectMake(self.tableView.frame.origin.x,44,self.tableView.contentSize.width,scrollHeight);
}
else if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone && cellCount < 7)
{
     //same as above but it's for the iPhone in portrait
     self.tableView.frame = CGRectMake(self.tableView.frame.origin.x,44,self.tableView.contentSize.width,scrollHeight);
}

Это работает наверняка.Возможно, вам придется настроить autoresizingMask внутри вашего .xib или в вашем коде, но этот взлом - единственное найденное мной решение, которое заботится обо всех переменных в моем случае.

...