当前位置:  开发笔记 > 编程语言 > 正文

如何调整UITableView的tableHeaderView?

如何解决《如何调整UITableView的tableHeaderView?》经验,为你挑选了6个好方法。

我无法调整tableHeaderView的大小.它简单不起作用.

1)创建UITableView和UIView(100 x 320 px);

2)将UIView设置为UITableView的tableHeaderView;

3)建立和去.一切都好.

现在,我想调整tableHeaderView的大小,所以我在viewDidLoad中添加了这段代码:

self.tableView.autoresizesSubviews = YES;

self.tableView.tableHeaderView = myHeaderView;
self.tableView.tableFooterView = myFooterView;

CGRect newFrame = self.tableView.tableHeaderView.frame;
newFrame.size.height = newFrame.size.height + 100;
self.tableView.tableHeaderView.frame = newFrame;

tableHeaderView的高度应显示为200,但显示为100.

如果我写:

self.tableView.autoresizesSubviews = YES;


CGRect newFrame = myHeaderView.frame;
newFrame.size.height = newFrame.size.height + 100;
myHeaderView.frame = newFrame;


self.tableView.tableHeaderView = myHeaderView;
self.tableView.tableFooterView = myFooterView;

然后它按照我想要的200高度开始.但我希望能够在运行时修改它.

我也试过这个,没有成功:

self.tableView.autoresizesSubviews = YES;

self.tableView.tableHeaderView = myHeaderView;
self.tableView.tableFooterView = myFooterView;

CGRect newFrame = self.tableView.tableHeaderView.frame;
newFrame.size.height = newFrame.size.height + 100;
self.tableView.tableHeaderView.frame = newFrame;

[self.tableView.tableHeaderView setNeedsLayout];
[self.tableView.tableHeaderView setNeedsDisplay];
[self.tableView setNeedsLayout];
[self.tableView setNeedsDisplay];

这里的要点是:我们如何在运行时调整tableHeaderView的大小?

有人能够这样做吗?

谢谢



1> kubi..:

仅供参考:我通过修改tableHeaderView并重新设置它来实现这一点.在这种情况下,当UIWebView子视图完成加载时,我正在调整tableHeaderView的大小.

[webView sizeToFit];
CGRect newFrame = headerView.frame;
newFrame.size.height = newFrame.size.height + webView.frame.size.height;
headerView.frame = newFrame;
[self.tableView setTableHeaderView:headerView];


@Andrew我知道这已经差不多一年了,但是从那时起就更好了:我能够通过用`[tableview beginUpdates]`和`[tableview]包装`setTableHeaderView:`来设置表头视图的高度变化的动画. endUpdates]`
+1这对我有用.在子视图改变大小后调用'setTableHeaderView'是关键.问题是,我的子视图将大小改变为一秒钟的动画.现在我想弄清楚如何使用它为tableHeaderView设置动画.
@jasongregori你添加的方便评论 - 我看到相同的技术(beginUpdates + endUpdates)不会像tableFeaderView一样动画tableFooterView的高度变化.你有没有找到一个很好的方法来动画tableFooterView?

2> garrettmoon..:

这个答案很老,显然不适用于iOS 7及更高版本.

我遇到了同样的问题,我也希望更改动画,所以我为我的标题视图创建了UIView的子类并添加了这些方法:

- (void)adjustTableHeaderHeight:(NSUInteger)newHeight{
    NSUInteger oldHeight = self.frame.size.height;
    NSInteger originChange = oldHeight - newHeight;

    [UIView beginAnimations:nil context:nil];

    [UIView setAnimationDuration:1.0f];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)];

    self.frame = CGRectMake(self.frame.origin.x, 
                        self.frame.origin.y, 
                        self.frame.size.width, 
                        newHeight);

    for (UIView *view in [(UITableView *)self.superview subviews]) {
        if ([view isKindOfClass:[self class]]) {
            continue;
        }
        view.frame = CGRectMake(view.frame.origin.x, 
                            view.frame.origin.y - originChange, 
                            view.frame.size.width, 
                            view.frame.size.height);
    }

    [UIView commitAnimations];
}

- (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context{
    [(UITableView *)self.superview setTableHeaderView:self];
}

这基本上为UITableView的所有子视图设置了动画,这些子视图与调用类的类类型不同.在动画结束时,它在superview(UITableView)上调用setTableHeaderView - 如果没有这个,UITableView内容将在用户下次滚动时跳回.到目前为止,我发现的唯一限制是,如果用户在动画发生时尝试滚动UITableView,滚动将动画,好像标题视图尚未调整大小(如果动画是动画,则不是很重要)快).



3> Besi..:

如果要有条件地为更改设置动画,可以执行以下操作:

- (void) showHeader:(BOOL)show animated:(BOOL)animated{

    CGRect closedFrame = CGRectMake(0, 0, self.view.frame.size.width, 0);
    CGRect newFrame = show?self.initialFrame:closedFrame;

    if(animated){
        // The UIView animation block handles the animation of our header view
        [UIView beginAnimations:nil context:nil];
        [UIView setAnimationDuration:0.3];
        [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];

        // beginUpdates and endUpdates trigger the animation of our cells
        [self.tableView beginUpdates];
    }

    self.headerView.frame = newFrame;
    [self.tableView setTableHeaderView:self.headerView];

    if(animated){
        [self.tableView endUpdates];
        [UIView commitAnimations];
    }
}

请注意,动画是双折的:

    下面的细胞动画tableHeaderView.这是使用beginUpdates和完成的endUpdates

    实际标题视图的动画.这是使用UIView动画块完成的.

为了同步这两个动画animationCurve必须设置为UIViewAnimationCurveEaseInOut和持续时间0.3,这似乎是UITableView用于它的动画.

更新

我在gihub上创建了一个Xcode项目,它就是这样做的.退房项目ResizeTableHeaderViewAnimated中BESI/IOS-快速问答

截图


此技术确实有效,但它不适用于带有节标题的表视图.当您使用开始更新/结束更新时,它会干扰动画块,留下重复的节标题.

4> Greg Martin..:

我认为如果你只设置myHeaderView的高度就可以了:

CGRect newFrame = myHeaderView.frame;
newFrame.size.height = newFrame.size.height + 100;
myHeaderView.frame = newFrame;

self.tableView.tableHeaderView = myHeaderView;



5> avishic..:

使用@garrettmoon解决方案直到iOS 7.
这是基于@ garrettmoon的更新解决方案:

- (void)adjustTableHeaderHeight:(NSUInteger)newHeight animated:(BOOL)animated {

    [UIView beginAnimations:nil context:nil];

    [UIView setAnimationDuration:[CATransaction animationDuration]];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)];

    self.frame = CGRectMake(self.frame.origin.x,
                        self.frame.origin.y,
                        self.frame.size.width,
                        newHeight);

    [(UITableView *)self.superview setTableHeaderView:self];

    [UIView commitAnimations];
}

- (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context{
    [(UITableView *)self.superview setTableHeaderView:self];
}



6> Darcy Rayner..:

这在iOS 7和8上适用于我.此代码在表视图控制器上运行.

[UIView animateWithDuration:0.3 animations:^{
    CGRect oldFrame = self.headerView.frame;
    self.headerView.frame = CGRectMake(oldFrame.origin.x, oldFrame.origin.y, oldFrame.size.width, newHeight);
    [self.tableView setTableHeaderView:self.headerView];
}];

推荐阅读
k78283381
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有