在UIScrollView内以编程方式调整UITableView的大小,并避免AutoLayout约束

时间:2012-12-17 01:00:51

标签: ios uitableview uiscrollview resize autolayout

我有一个UIScrollView,里面包含一些组件。其中一个控件是UITableView,用于显示电影的时间表列表,最多约7行。

我设置的UITableView不允许任何类型的移动,并且通过编程改变其大小以适合于它的内容,并且还增加的UIScrollView的内容的大小,以便它可以顺利地滚动。

只要屏幕上显示视图,调整大小就会正常工作,但是当我滚动UIScrollView以查看下面时,UITableView会返回其先前的大小。

请参阅下一张图片:http://d.pr/i/rKzb

我使用Storyboard AutoLayout设计界面,UITableView有以下限制:

http://i.stack.imgur.com/GowOG.png

以下是我如何调整控件的大小:

- (void) resizeViews {
    //
    // Synopsis
    //
    CGRect synopsisNewFrame = [Utilities adjustLabel:_movieSynopsis frameForText:_movieSynopsis.text];
    [_movieSynopsis setFrame:  synopsisNewFrame];


    //
    // Schedules
    //
    CGRect schedulesNewFrame = CGRectMake(self.tableView.frame.origin.x,
                                      _movieSynopsis.frame.origin.y + _movieSynopsis.frame.size.height + 4,
                                      self.tableView.frame.size.width,
                                      self.tableView.contentSize.height);

    [self.tableView setFrame: schedulesNewFrame];

    //
    // Scroll View
    //

    CGSize scrollSize = CGSizeMake(292, self.tableView.frame.origin.y + self.tableView.frame.size.height + 10);

    [_scrollView setTranslatesAutoresizingMaskIntoConstraints:NO];
    [_tableView setTranslatesAutoresizingMaskIntoConstraints:NO];

    [self.tableView setContentSize: scrollSize];
    [self.tableView setContentOffset:CGPointMake(0, 0)];

} 

这里是我调用resizeView(在ViewController中)的地方:

- (void) viewDidAppear:(BOOL)animated {
    [self resizeViews];
}

有没有办法避免这种情况发生?

我很确定问题是具有UITableView的约束。

在使用AutoLayout时,让我建议使用解决方案来防止这种情况发生。

提前感谢您的帮助。

(抱歉,我无法发布图片)

3 个答案:

答案 0 :(得分:0)

我今天遇到了同样的问题。如您所料,这是AutoLayout问题。我现在还不确定如何正确解决它。但是,如果你禁用AutoLayout,它会没事的。为此,您可以打开XIB文件选择File Inspector选项卡,然后在使用AutoLayout之前删除检查

答案 1 :(得分:0)

由于您使用AutoLayout,您需要调整身高限制。

请参阅此帖子Change UITableView height dynamically

答案 2 :(得分:0)

如果要设置与您在故事板中完成的内容匹配的scrollView的contentSize,请在viewDidAppear中执行此操作。

    [self.scrollView setContentOffset:CGPointZero animated:NO];