UIScrollView 内容大小在不应该剪切子视图时剪切子视图



我有一个UIScrollView,它包含几个动态调整大小的子视图。我可以很好地调整子视图的大小和布局,但当我设置滚动视图本身的内容大小时,底部的子视图会被剪切。滚动视图的内容大小高度应该大于其包含的视图的高度之和,这有什么原因吗?

以下是我的详细情况:我有一个包含UIScrollView的超级视图,它包含几个子视图。在superview的layoutSubviews方法中,我计算了每个子视图所需的大小,然后设置框架,使子视图在屏幕上垂直平铺,其间留有一点空间。完成后,我将UIScrollView内容大小的高度设置为最后一个子视图的末尾(origin.y+size.height)。理论上,这意味着滚动视图内容区域的底部应该与最后一个子查看的底部完全对齐。

但事实并非如此。相反,最后一个子视图的一个漂亮的块被剪切了。它仍然在那里——如果我向下滚动,我可以在"反弹"过程中看到剩余的部分。在横向模式下,问题更严重——底部子视图的大部分根本看不见。

所有子视图都得到了正确的排列和定位。问题是UIScrollView的contentSize似乎需要明显大于子视图的高度之和(加上它们之间的空间)。这对我来说没有任何意义。此外,大小"关闭"的量也不尽相同——我用不同的子视图重复使用这个视图好几次,它们都关闭了不同的量。因此,简单地在内容视图高度中添加一个常量是没有帮助的。

是什么原因导致内容大小(或我的身高计算)无法正常工作?

代码:

- (void)layoutSubviews
{
    [super layoutSubviews];
    CGFloat width = self.bounds.size.width - [self subviewLeftMargin] - [self subviewRightMargin]; // All subviews have same width as parent view
    CGFloat x = [self subviewLeftMargin]; // All subviews should start at the far left of the view 
    CGFloat y = [self spaceBetweenSubviews]; // Running tally of the y coordinate for the next view
    /* Adjust the subviews */
    for(UIView *view in self.theVariousSubviews) {  
        /* Resize the view with the desired width, then let it size its height as needed */
        view.frame = CGRectMake(view.frame.origin.x, view.frame.origin.y, width, view.frame.size.height);
        CGSize newSize = [view sizeThatFits:view.frame.size];
        /* Set the origin */
        //The subviews are positioned correctly, so this doesn't seem to be a problem
        view.frame = CGRectMake(x, y, newSize.width, newSize.height);
        /* Have the view refresh its own layout */
        [view setNeedsLayout];
        /* Update the y value for the next subview */
        y += newSize.height + [self spaceBetweenSubviews];
    }
    /* Resize the scroll view to ensure it fits all of the content */
    CGFloat scrollViewHeight = y;
    self.scrollView.contentSize = CGSizeMake(self.scrollView.contentSize.width, scrollViewHeight);
    //Content size is set to the same total height of all subviews and spacing, yet it is too small. Why?
}

hi在我看来,您的计算和调整大小的时机不对。如果没有布局更改的缺失代码,我就无法完全理解这个问题。

让我印象深刻的是,你两次分配view.frame,在新的计算之间,你用子youting拦截过程,这可能会改变你的计算所依赖的一些值。

我只能建议您将计算与布局分离,并且在计算时不要调用方法。为了说明问题,你应该删除一个缺少计算的示例应用程序,或者自己添加一些NSLog语句,显示任何子视图的帧原点大小和滚动视图的contentOffset。根据我的经验,滚动视图通常工作正常,所以我希望您的代码中有一个错误。

相关内容

  • 没有找到相关文章

最新更新