Проблема с размером содержимого для UITableView в UIscrollView
Я действительно создаю UIScrollView
С UITableView
внутри него с помощью interface builder. Я устанавливаю размер содержимого my UIScrollView
С:
scrollView.contentSize = CGSizeMake(self.view.frame.size.width, self.view.frame.size.height);
и я установил представление владельца моего файла в UIScrollView
Я создал IBOutlet
UITableView
и я установил его в построителе интерфейса.
при загрузке представления. он отображает правильный размер содержимого для моего UIScrollView
. Но он не отображает правильный размер содержимого для my UITableView
. Кроме того, когда я изменяю содержание размер моего UIScrollView
, Он изменяет размер содержимого my UITableView
как если бы оба размера контента были связаны.
кто-нибудь знает, как я могу сохранить размер содержимого моего представления таблицы, которое я установил в построителе интерфейса?
4 ответов
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;
пример динамического управления высотой 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
}
ссылки:
Если у вас все еще есть проблемы, попробуйте это без необходимости scrollView.
поиграв с примером DBD некоторое время, я обнаружил, что фрейм и 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);
}
это работает точно. Возможно ,вам придется настроить маску autoresizing внутри вашего.xib или в вашем коде, но этот хак-единственное решение, которое я нашел, которое заботится обо всех различных переменных в моем случае.
вызов ниже метода несколько раз. Каждый раз, когда вы звоните, будет больше клеток.
CGRect tableFrame = tableView.frame;
tableFrame.size.height = tableView.contentSize.height;
tableView.frame = tableFrame;
scrollView.contentSize = tableView.contentSize;