动态改变UITableView的高度(Change UITableView height dynam

2019-07-18 00:25发布

我想从基于其细胞的高度之和另一视图 - 控制改变我的tableview的高度,因为它们是动态的。 它是在所有可能的? 谢谢

添加在:

我基本上已经是对屏幕的一半containerview一个UserProfileViewController。 在那里,我添加不同的其他viewcontrollers:

在墙上按钮的情况下,这是我添加视图 - 控制和它的后续实现代码如下:

- (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;
}

并在视图 - 控制这就是我初始化我的tableview:

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

我计算单元的身高,他总和,问题是细胞的高度方法被调用的方式TE的tableview的消气后调用。 所以我需要某种方法来知道什么时候该单元的高度方法对所有细胞完成的,然后我可以调整我的tableview。 谢谢

Answer 1:

没有一个系统功能更改基于的tableview内容表的高度。 话虽如此,能够以编程方式更改基于内容的的tableview的高度,具体地基于contentSize所述的tableview(这是比手动计算高度自己更容易)。 一些细节的变化取决于是否使用新的自动布局这是iOS 6中,或者不是的一部分。

但是,假设你在配置表视图的底层模型在viewDidLoad ,如果你想那么调整的tableview的高度,你可以做到这一点viewDidAppear

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

    [self adjustHeightOfTableview];
}

同样,如果你执行一个reloadData (或以其他方式增加或删除行)的实现代码如下,你会希望确保您也手动调用adjustHeightOfTableView那儿,就如:

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

    [self adjustHeightOfTableview];
}

所以,问题是应该怎样我们adjustHeightOfTableview做。 不幸的是,这是你是否使用iOS 6的自动版式或不是一个函数。 你可以决定你是否有自动布局打开,打开你的故事板或NIB并转到“文件检查器”(例如按选项 + 命令 + 1或点击右侧面板上是第一选项卡上):

假设一秒钟即自动布局是关闭的。 在这种情况下,它很简单, adjustHeightOfTableview只会调整frame中的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 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有通过点击中心按钮按键组在这里,然后选择要添加的高度限制的高度约束:

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

  3. 请确保您调整其他方面的限制,使他们如果您以编程方式调整大小的tableview不冲突。 在我的例子中,tableview中有它锁定在屏幕底部的尾部空间限制,所以我不得不调整该约束,这样,而不是在一个特定的大小被锁定,这可能是大于或等于一个值,优先级较低,这样的tableview的高度和顶部将统治的日子:

    你与其他约束做些什么,这里将完全取决于你有你的屏幕上实现代码如下下面什么其他控件。 与往常一样,处理的限制是有点别扭,但它肯定有效,但在你的情况的具体细节完全取决于您对现场还有什么依赖。 但希望你的想法。 底线,用自动布局,一定要调整你的其他约束(如果有的话),以灵活考虑到不断变化的tableview高度。

正如你所看到的,这是容易得多,如果你不使用自动布局以编程方式调整的tableview的高度,但如果你是,我提出两种选择。



Answer 2:

创建由厦门国际银行或故事板的细胞。 给它的插座中的内容。 现在调用它的cellForRowAtIndexPath。 例如。 如果你想根据评论的标签文本设置单元格的高度。

所以设置你commentsLbl.numberOfLine = 0;

所以设置你commentsLbl.numberOfLine = 0;

然后在viewDidLoad中

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

现在

-(float)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
return UITableViewAutomaticDimension;}


Answer 3:

这里的答案很多不兑现表的变化或者太复杂。 使用的一个子类UITableView ,将正确设置intrinsicContentSize使用自动布局时是一个更容易的解决方案。 没有高度限制等需要。

class UIDynamicTableView: UITableView
{
    override var intrinsicContentSize: CGSize {
        self.layoutIfNeeded()
        return CGSize(width: UIViewNoIntrinsicMetric, height: self.contentSize.height)
    }

    override func reloadData() {
        super.reloadData()
        self.invalidateIntrinsicContentSize()
    }
} 

设置你的类对TableView中的UIDynamicTableView在界面生成器,观看神奇的,因为这将TableView中的呼叫后改变它的大小reloadData()



Answer 4:

这可以简化大规模只有1行中viewDidAppear代码:

    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)

        tableViewHeightConstraint.constant = tableView.contentSize.height
    }


Answer 5:

罗布的解决方案是很不错的,唯一的事情,在他的-(void)adjustHeightOfTableview方法调用的

[self.view needsUpdateConstraints]

什么都不做,它只是返回一个标志,而不是调用

[self.view setNeedsUpdateConstraints]

将预期的效果。



Answer 6:

使用简单易典

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        let myCell = tableView.dequeueReusableCellWithIdentifier("mannaCustumCell") as! CustomCell
        let heightForCell = myCell.bounds.size.height;

        return heightForCell;
    }


Answer 7:

对于调整我的表我在我的tableview控制器巫这个解决方案又是完美的罚款:

[objectManager getObjectsAtPath:self.searchURLString
                         parameters:nil
                            success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
                                NSArray* results = [mappingResult array];
                                self.eventArray = results;
                                NSLog(@"Events number at first: %i", [self.eventArray count]);
                                CGRect newFrame = self.activityFeedTableView.frame;
                                newFrame.size.height = self.cellsHeight + 30.0;
                                self.activityFeedTableView.frame = newFrame;

                                self.cellsHeight = 0.0;

                            }
                            failure:^(RKObjectRequestOperation *operation, NSError *error) {
                                UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error"
                                                                                message:[error localizedDescription]
                                                                               delegate:nil
                                                                      cancelButtonTitle:@"OK"
                                                                      otherButtonTitles:nil];
                                [alert show];
                                NSLog(@"Hit error: %@", error);
                            }];

该调整部分是一个方法,但这里只是所以你可以看到它。 现在唯一的问题,我haveis调整中的其他视图控制器滚动视图,因为我有当的tableview已经完成调整不知道。 目前,我与performSelector做:afterDelay:但是这是真的不要做的好方法。 有任何想法吗?



Answer 8:

我发现添加约束编程比在故事板要容易得多。

    var leadingMargin = NSLayoutConstraint(item: self.tableView, attribute: NSLayoutAttribute.LeadingMargin, relatedBy: NSLayoutRelation.Equal, toItem: self.mView, attribute: NSLayoutAttribute.LeadingMargin, multiplier: 1, constant: 0.0)

    var trailingMargin = NSLayoutConstraint(item: self.tableView, attribute: NSLayoutAttribute.TrailingMargin, relatedBy: NSLayoutRelation.Equal, toItem: mView, attribute: NSLayoutAttribute.TrailingMargin, multiplier: 1, constant: 0.0)

    var height = NSLayoutConstraint(item: self.tableView, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: screenSize.height - 55)

    var bottom = NSLayoutConstraint(item: self.tableView, attribute: NSLayoutAttribute.BottomMargin, relatedBy: NSLayoutRelation.Equal, toItem: self.mView, attribute: NSLayoutAttribute.BottomMargin, multiplier: 1, constant: screenSize.height - 200)

    var top = NSLayoutConstraint(item: self.tableView, attribute: NSLayoutAttribute.TopMargin, relatedBy: NSLayoutRelation.Equal, toItem: self.mView, attribute: NSLayoutAttribute.TopMargin, multiplier: 1, constant: 250)

    self.view.addConstraint(leadingMargin)
    self.view.addConstraint(trailingMargin)
    self.view.addConstraint(height)
    self.view.addConstraint(bottom)
    self.view.addConstraint(top)


文章来源: Change UITableView height dynamically