gpt4 book ai didi

ios - 动态更改 UITableView 高度

转载 作者:IT王子 更新时间:2023-10-29 07:33:50 24 4
gpt4 key购买 nike

我想根据单元格高度的总和从另一个 View Controller 更改我的表格 View 的高度,因为它们是动态的。有可能吗?谢谢

附加组件:

我基本上拥有的是一个 UserProfileViewController,它在屏幕的一半上有一个 containerview。在那里我添加了不同的其他 View Controller :

enter image description here

enter image description here

在墙上按钮的情况下,这是我添加 View Controller 及其后续 TableView 的方式:

- (IBAction)wallButtonPressed:(id)sender
{
//Check if there is an instance of the viewcontroller we want to display. If not make one and set it's tableview frame to the container's view bounds
if(!_userWallViewController) {
self.userWallViewController = [[WallViewController alloc] init];
// self.userWallViewController.activityFeedTableView.frame = self.containerView.bounds;

}

[self.userWallViewController.containerView addSubview:self.userWallViewController.activityFeedTableView];
//If the currentviewcontroller adn it's view are already added to the hierarchy remove them
[self.currentViewController.view removeFromSuperview];
[self.currentViewController removeFromParentViewController];

//Add the desired viewcontroller to the currentviewcontroller
self.currentViewController = self.userWallViewController;

//Pass the data needed for the desired viewcontroller to it's instances
self.userWallViewController.searchURLString = [NSString stringWithFormat:@"event/user/%@/", self.userID];
self.userWallViewController.sendCommentURLString = [NSString stringWithFormat:@"event/message/%@", self.userID];

[self.userWallViewController.activityFeedTableView reloadData];

self.userWallViewController.totalCellHeight = ^(float totalCellHeight){

self.scrollView.contentSize = CGSizeMake(320.0, totalCellHeight);
CGRect newFrame = self.userWallViewController.containerView.frame;
newFrame.size.height = totalCellHeight + 33.0;
self.userWallViewController.containerView.frame = newFrame;

self.userWallViewController.activityFeedTableView.frame = self.containerView.bounds;
};

//Add this containerview to the desired viewcontroller's containerView
self.userWallViewController.containerView = self.containerView;


//Add the needed viewcontroller and view to the parent viewcontroller and the containerview
[self addChildViewController:self.userWallViewController];
[self.containerView addSubview:self.userWallViewController.view];

//CLEAN UP THE CONTAINER VIEW BY REMOVING THE PREVIOUS ADDED TABLE VIEWS
[self.userFansViewController.userSimpleTableView removeFromSuperview];
[self.fanOfViewController.userSimpleTableView removeFromSuperview];
[self.userPublishedMovellaListViewController.gridView removeFromSuperview];

[self.userPublishedMovellaListViewController removeFromParentViewController];

self.userPublishedMovellaListViewController = nil;
}

在那个 viewcontroller 中,这是我初始化 tableview 的地方:

-(UITableView *)activityFeedTableView
{
if (!_activityFeedTableView) {
_activityFeedTableView = [[UITableView alloc] initWithFrame:CGRectMake(0.0, 0.0, 320.0, 850.0) style:UITableViewStylePlain];
}
return _activityFeedTableView;
}

我正在计算单元格高度的总和,问题是单元格的高度方法是在调用 tableview 的 getter 之后调用的。因此,我需要某种方式来了解何时对所有单元格执行单元格的高度方法,然后我可以调整表格 View 的大小。谢谢

最佳答案

没有系统功能可以根据表格 View 的内容更改表格的高度。话虽如此,可以根据内容以编程方式更改 tableview 的高度,特别是根据 tableview 的 contentSize(这比您自己手动计算高度更容易)。一些细节会有所不同,具体取决于您是否使用 iOS 6 中的新自动布局。

但假设您在 viewDidLoad 中配置您的 TableView 的底层模型,如果您想随后调整 TableView 的高度,您可以在 viewDidAppear 中执行此操作:

- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];

[self adjustHeightOfTableview];
}

同样,如果您曾经为 tableview 执行过 reloadData(或以其他方式添加或删除行),您需要确保您也手动调用了 adjustHeightOfTableView还有,例如:

- (IBAction)onPressButton:(id)sender
{
[self buildModel];
[self.tableView reloadData];

[self adjustHeightOfTableview];
}

所以问题是我们的adjustHeightOfTableview应该做什么。不幸的是,这取决于您是否使用 iOS 6 自动布局。您可以通过打开 Storyboard或 NIB 并转到“文件检查器”(例如,按 option+command+1 或单击右侧面板上的第一个选项卡):

enter image description here

让我们暂时假设自动布局已关闭。在那种情况下,它非常简单,adjustHeightOfTableview 只需调整 tableview 的 frame:

- (void)adjustHeightOfTableview
{
CGFloat height = self.tableView.contentSize.height;
CGFloat maxHeight = self.tableView.superview.frame.size.height - self.tableView.frame.origin.y;

// if the height of the content is greater than the maxHeight of
// total space on the screen, limit the height to the size of the
// superview.

if (height > maxHeight)
height = maxHeight;

// now set the frame accordingly

[UIView animateWithDuration:0.25 animations:^{
CGRect frame = self.tableView.frame;
frame.size.height = height;
self.tableView.frame = frame;

// if you have other controls that should be resized/moved to accommodate
// the resized tableview, do that here, too
}];
}

不过,如果您的自动布局已打开,adjustHeightOfTableview 会调整您的 tableview 的高度限制:

- (void)adjustHeightOfTableview
{
CGFloat height = self.tableView.contentSize.height;
CGFloat maxHeight = self.tableView.superview.frame.size.height - self.tableView.frame.origin.y;

// if the height of the content is greater than the maxHeight of
// total space on the screen, limit the height to the size of the
// superview.

if (height > maxHeight)
height = maxHeight;

// now set the height constraint accordingly

[UIView animateWithDuration:0.25 animations:^{
self.tableViewHeightConstraint.constant = height;
[self.view setNeedsUpdateConstraints];
}];
}

为了使后一种基于约束的解决方案与自动布局一起工作,我们必须首先处理几件事:

  1. 单击此处按钮组中的中心按钮,然后选择添加高度限制,确保您的 tableview 具有高度限制:

    add height constraint

  2. 然后为该约束添加一个 IBOutlet:

    add IBOutlet

  3. 请确保您调整了其他约束条件,这样当您以编程方式调整 tableview 的大小时它们就不会发生冲突。在我的示例中,tableview 有一个尾随空间约束,将其锁定在屏幕底部,因此我必须调整该约束,以便它可以大于或等于一个值,而不是被锁定在特定大小,并且具有较低的优先级,以便 tableview 的高度和顶部将决定这一天:

    adjust other constraints

    你在这里用其他约束做什么将完全取决于你在屏幕上 tableview 下面的其他控件。与往常一样,处理约束有点尴尬,但它确实有效,尽管您所处情况的具体情况完全取决于您在现场的其他情况。但希望你明白了。最重要的是,使用自动布局,请确保调整其他约束(如果有)以灵活应对不断变化的 tableview 高度。

如您所见,如果您不使用自动布局,则以编程方式调整 tableview 的高度会容易得多,但如果您使用了,我会提供两种选择。

关于ios - 动态更改 UITableView 高度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14223931/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com