关于UIScrollView的一些问题

时间:2013-03-19 12:49:37

标签: ios objective-c uiscrollview

我很难理解你可能会发现的一些关于UIScrollView的简单问题。

  1. 为什么我们增加contentSize而不是UIScrollView的范围? 实际上,我不明白界限和contentSize的作用。

  2. 当我将pagingEnabled设置为YES时,scrollView如何知道停止滚动的位置?

  3. 我想在UIScrollView的页面之间添加间隙。 (pagingEnabled = YES) 我在互联网上搜索,我发现以下代码,rob mayoff写道:

  4. - (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的框架?

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

    4. 我很长时间都在努力理解这些问题。 今天我决定把它们写在这里。

      谢谢。

2 个答案:

答案 0 :(得分:5)

1-您可以查看bounds的{​​{1}}属性的实际说明:

  

bounds矩形,用于描述视图的位置和大小   它自己的坐标系。

实际的UView

contentSize

第一个与The size of the content view. 相对于自身的实际大小相关(与UIView相关的frame)。第二个与superView相关,其contentSize大于contentSize,为您提供滚动功能。

2-来自文档:

  

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

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

3-通过将每个页面中“{1}}”放在小于实际页面的位置来创建间隙。这基本上是Rob在这里做的事情:

UIScrollView

所以UIView包含以下框架 CGRect frame = CGRectMake(scrollViewSize.width * i, 0, scrollViewSize.width - kGutterWidth, scrollViewSize.height); UIScroll(0.0f,0.0f,320.0f,480.0f)会给出这样的结果:

第1项的框架=&gt; contentSize

第二项的框架=&gt; (1280.0f,480.0f)

第3项的框架=&gt; (0.0f,0.0f,300.0f,480.0f)

第4项的框架=&gt; (320.0f,0.0f,300.0f,480.f)


修改1.0:

  

我根本不明白。什么是“放置视图   每个页面内部小于实际页面“?

所以让我们举个例子,我用过:所以你现在有4个“页面”,实际上你所拥有的基本上是(640.0f,0.0f,300.0f,480.0f)分为3次,它给你4个不同的地方,我们可以调用页面。在每个“页面”内部,为了给出每个页面之间的“空间”感,您将使(960.0f,0.0f,300.0f,480.0f)小于实际页面。

编辑2.0:

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

enter image description here

编辑3.0:

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

答案 1 :(得分:0)

  1. 边界是视图的真实容器。 contentSize是“可查看”的大小。示例:一个100 px高度的表,但包含十几个单元格,单元格为20 px。你的总大小是≈240px,这是contentSize,但边界高度是100 px。