【问题标题】:Some questions about UIScrollView关于 UIScrollView 的一些问题
【发布时间】:2013-03-19 12:49:36
【问题描述】:

我很难理解关于UIScrollView 的一些您可能觉得简单的问题。

  1. 为什么我们增加contentSize 而不是UIScrollView 的边界? 其实我不明白bounds和contentSize做了什么。

  2. 当我将pagingEnabled 设置为YES 时,scrollView 怎么知道在哪里停止滚动?

  3. 我想在我的UIScrollView 中的页面之间添加一个空白。 (pagingEnabled = YES) 我在网上搜索了一下,找到了如下代码,rob mayoff 写的:

- (void)viewDidLoad {
    [super viewDidLoad];

    NSArray *colors = [NSArray arrayWithObjects:[UIColor redColor], [UIColor greenColor], [UIColor blueColor], nil];

    #define kGutterWidth 20

    UIScrollView *scrollView = self.scrollView;
    CGRect scrollViewFrame = scrollView.frame;
    scrollViewFrame.size.width += kGutterWidth;
    scrollView.frame = scrollViewFrame;

    CGSize scrollViewSize = scrollView.bounds.size;

    for (int i = 0; i < colors.count; i++) {
        CGRect frame = CGRectMake(scrollViewSize.width * i, 0,
            scrollViewSize.width - kGutterWidth, scrollViewSize.height);
        UIView *subview = [[UIView alloc] initWithFrame:frame];
        subview.backgroundColor = [colors objectAtIndex:i];
        [scrollView addSubview:subview];
        [subview release];
    }

    scrollView.contentSize = CGSizeMake(
        colors.count * scrollViewSize.width,
        scrollViewSize.height);
}

代码来源: How to create a paging scrollView with space between views

这段代码可以正常工作,但只要我看不懂也没关系。

  1. 我知道页面最终会以原始大小加载,但我不明白这是怎么发生的,因为每个页面都减去了 kGutterWidth。

  2. 为什么rob用kGutterWidth增加了scrollView的frame?

  3. 好的,这个问题可能听起来很愚蠢,但我真的不明白。 在代码中,Rob 创建了一个名为 scrollView 的新 scrollView 对象。 它的值等于self.scrollView 值。 好吧,我不明白对scrollView 所做的更改是如何影响self.scrollView, 因为它们是不同的对象。它们的内存地址不同。

长期以来,我一直在努力理解这些问题。 今天我决定把它们写在这里。

谢谢。

【问题讨论】:

    标签: ios objective-c uiscrollview


    【解决方案1】:

    1- 您可以查看UViewbounds 属性的实际描述:

    边界矩形,描述视图的位置和大小 自己的坐标系。

    还有实际的contentSize

    The size of the content view.
    

    第一个与UIView 相对于自身的实际大小有关(即frame 相对于其superView)。第二个与它的contentSize 有关,其中contentSize 比它的frame 大,为您提供滚动能力。

    2- 来自文档:

    如果此属性的值为 YES,则滚动视图在 用户滚动时滚动视图边界的倍数。这 默认值为 NO。

    我猜它是根据UIScrollViewcontentSize 的大小(宽度)计算得出的。例如,具有 320p 帧的 640p contentSize UIScrollView 将有 2 个“页面”。 (640/320 = 2)。

    3- 间隙是通过将UIView 放置在每个页面“内部”小于实际页面而创建的。这基本上就是 Rob 在这里所做的:

      CGRect frame = CGRectMake(scrollViewSize.width * i, 0,
                scrollViewSize.width - kGutterWidth, scrollViewSize.height);
    

    因此,UIScroll 与以下框架 (0.0f,0.0f,320.0f,480.0f)contentSize(1280.0f,480.0f) 将给出:

    第一项的框架 => (0.0f,0.0f,300.0f,480.0f)

    第二个项目的框架 => (320.0f,0.0f,300.0f,480.f)

    第三个项目的框架 => (640.0f,0.0f,300.0f,480.0f)

    第四项的框架=> (960.0f,0.0f,300.0f,480.0f)


    编辑 1.0:

    我完全不明白。你是什​​么意思“把视图 每个页面都比实际页面小”?

    让我们举个例子,我用过:所以你目前有4个“页面”,实际上你拥有的基本上是UIScrollView被划分了3次,这给了你4个不同的地方,我们可以称之为页面。在每个“页面”内部,为了让每个页面之间有一种“空间”感,您将放置一个小于实际页面的UIView

    编辑 2.0:

    也许更直观的东西会帮助你:

    编辑 3.0:

    如果您了解分页的工作原理,这很容易...... 320px + 20px = 340px,比 iPhone 屏幕尺寸的 320px 还大。由于添加到UIScrollView 的每个UIView 都有340-20 = 320px,因此您将拥有大小为340px 的“页面”。所以 340*3(UIViews 的数量)它给出了 1020px 最终基本上是 3 UIViews + 3 Spaces

    【讨论】:

    • 1.如果bounds有自己的坐标系并且相对于scrollView,为什么bounds的宽度不等于contentSize的宽度?
    • 2.计算是基于框架的宽度还是边界的宽度? (或者他们是平等的?)
    • contentSize 与里面的东西有关,而width 与你能看到的东西有关……放一副双筒望远镜……你看到的是view ,世界是contentSize。转动双筒望远镜的能力是滚动……我的例子有意义吗?
    • 如果我没记错的话,那就是根据它的界限。请参阅此内容以更好地了解不同之处:littlehales.files.wordpress.com/2012/03/coords.jpg
    • 所以说 UIScrollView 的时候,bounds.width 总是等于 frame.width ,唯一的区别就是坐标系?
    【解决方案2】:
    1. 边界是视图的真正容器。 contentSize 是“可视”大小。示例:一个高度为 100 像素但包含十几个单元格的表格,其中单元格为 20 像素。您的总大小约为 240 像素,这是 contentSize,但边界高度为 100 像素。

    【讨论】:

      猜你喜欢
      • 2018-05-24
      • 2013-07-07
      • 2013-05-10
      • 2012-03-18
      • 2023-03-09
      • 2021-07-01
      • 2011-09-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多