【问题标题】:Tableview frame issue when put in a scrollview放入滚动视图时的Tableview框架问题
【发布时间】:2015-08-18 15:57:25
【问题描述】:

我想发布一个 gif,但显然我没有足够的声誉。哦,好吧,无论如何;我使用的是 UIPageViewController,但出于某种原因,我决定采用更手动的解决方案,即使用 UIScrollView 并将 UITableViewControlllers 的视图添加到相应的偏移量(页面)。我在每个页面上有 4 个 UItableViewController(表格视图控制器的视图),所有这些都作为子视图控制器添加到容器视图控制器(具有 UIScrollView)中。

实际的问题是,当我进行切换时,表格视图开始拒绝一直向下移动,并且当滚动结束时,最终表格视图单元格的一部分在屏幕末端保持修剪状态。

所以,想问一下是否有人遇到过这样的事情,知道如何摆脱这种情况。我知道我总是可以使用图书馆,但我想学习。这是一些代码:

_containerScrollView = [[UIScrollView alloc] initWithFrame:self.view.frame];
_containerScrollView.contentSize = CGSizeMake(_containerScrollView.frame.size.width * 4, 0.0f);
_containerScrollView.pagingEnabled = YES;

[self.view addSubview:_containerScrollView];

UITableViewController *vc1 = [[UIViewController alloc] init];
UITableViewController *vc2 = [self.storyboard instantiateViewControllerWithIdentifier:@"trendingViewController"];
UITableViewController *vc3 = [self.storyboard instantiateViewControllerWithIdentifier:@"placesViewController"];
UITableViewController *vc4 = [self.storyboard instantiateViewControllerWithIdentifier:@"favoritesViewController"];

self.rallyViewControllers = [NSArray vc1, vc2, vc3, vc4, nil];

[self addViewControllers];

其他方法;

- (void)addViewControllers{

     if (self.rallyViewControllers == nil) {

        return;

     }

     for (int i = 0; i < [self.rallyViewControllers count]; i++) {

         UIViewController* viewController = [self.rallyViewControllers objectAtIndex:i];

         [self addChildViewController:viewController];
         [viewController didMoveToParentViewController:self];

         [_containerScrollView addSubview:viewController.view];

     }

}

这是在viewDidLayoutSubviews中调用的

- (void)configureFrames{

    if (self.rallyViewControllers == nil) {

    return;

    }

    CGFloat width = _containerScrollView.frame.size.width;
    CGFloat height = _containerScrollView.frame.size.height;

    for (int i = 0; i < [self.rallyViewControllers count]; i++) {

        UIViewController *viewController = [self.rallyViewControllers objectAtIndex:i];
        viewController.view.frame = CGRectMake(i * width, 0.0f, width, height);

    }

}

【问题讨论】:

    标签: ios objective-c uitableview uiscrollview contentsize


    【解决方案1】:

    我应该提前声明我没有完全理解你对

    的描述

    "表视图开始拒绝一直向下和部分 最终表格视图单元格在屏幕结束时保持修剪 滚动结束。”

    我的回答是基于我之前遇到的一个问题。我的设置是故事板容器视图中的一个 uitableview(没有任何父滚动视图)

    我遇到了这个问题,其中部分 tableview 被切断,我看不到大约 5 行底部。


    原来我没有在父容器视图和表视图之间设置任何约束。


    要确定您的表格视图是否呈现正常,请让您的项目在 XCode 中运行,然后按下下面的按钮

    然后,此按钮将暂停您的应用,并为您提供当前在您的应用中呈现的不同视图的视觉堆栈。然后,您可以查看是否有任何子项(在您的情况下为 tableviews)呈现在父视图的框架之外,在这种情况下,该部分将不可见。这表明您要么没有约束(或)您拥有的当前约束不正确。

    【讨论】:

    • 感谢您的回复。好吧,我已经检查了视图层次结构浏览器或任何它被称为的东西,但我看不出它有问题。如果我可以发布该死的 gif,问题就会很清楚。你能详细说明关于约束的部分吗?我正在以编程方式做所有的事情......
    • 我会这样做的。但如果你能展示你在这两者之间施加的限制,它也会对我有所帮助。只是对 4 个周围边缘的约束,还是您也设置了固定大小的约束?我知道当涉及到滚动视图时,约束有点棘手。
    • 您需要以这样一种方式创建约束,即每个 UI 元素都可以根据应用程序的方向准确地知道它需要渲染的位置。理想的起点是在每个 tableview 和包含视图之间创建约束以及每个 tableview 之间的约束。我很难在没有代码的情况下评论你目前拥有的约束
    • 好吧,我来玩一下约束,看来问题就出在这里了。
    【解决方案2】:

    我明白了。问题是当我将视图控制器视图添加到滚动视图时,它们返回的尺寸就像没有导航栏一样。但它们仍然位于导航栏下方,这导致总视图的高度比屏幕显示的高 64 pt。当我从视图中手动减去 64 pt 时,它已修复。但由于这是一种非常粗糙的方法,因此我尝试通过摆弄自动布局来修复它,结果很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-12
      • 2013-07-26
      • 2017-08-25
      • 2013-12-22
      • 1970-01-01
      • 1970-01-01
      • 2011-02-26
      相关资源
      最近更新 更多