关于UIScrollView的一些问题

Noa*_*ick 2 objective-c uiscrollview ios

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

  1. 为什么我们增加contentSize而不是增加UIScrollView?实际上,我不明白界限和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);
}
Run Code Online (Sandbox Code Playgroud)

代码的来源: 如何在视图之间创建一个带有空格的分页scrollView

这段代码工作正常,但只要我不理解它就没关系.

  1. 我知道最终页面将加载其原始大小,但我不明白它是如何发生的,因为每个页面都用kGutterWidth减去.

  2. 为什么rob会使用kGutterWidth增加scrollView的框架?

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

我很难理解这些问题很长一段时间.今天我决定把它们写在这里.

谢谢.

Rui*_*res 5

1-您可以查看以下bounds属性的实际描述UView:

边界矩形,用于描述视图在其自身坐标系中的位置和大小.

而实际的contentSize:

The size of the content view.
Run Code Online (Sandbox Code Playgroud)

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

2-从文档:

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

我想它是根据你的尺寸(宽度)来计算UIScrollViewcontentSize.例如,具有320p contentSize UIScrollView帧的640p 将具有2"页".(640/320 = 2).

3-通过将UIView每个页面"内部"的内容小于实际页面来创建间隙.这基本上是Rob在这里做的事情:

  CGRect frame = CGRectMake(scrollViewSize.width * i, 0,
            scrollViewSize.width - kGutterWidth, scrollViewSize.height);
Run Code Online (Sandbox Code Playgroud)

因此,一个UIScroll具有以下框架(0.0f,0.0f,320.0f,480.0f),用contentSize(1280.0f,480.0f)会给这样的:

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

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

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

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


编辑1.0:

我根本不明白."将每个页面中的视图放在比实际页面小的位置"是什么意思?

所以让我们举个例子,我用过:所以你现在有4个"页面",实际上你所拥有的基本上是UIScrollView分为3次,它给你4个不同的地方,我们可以调用页面.在每个"页面"里面,为了给每个页面之间的"空间"感,你要放一个UIView小于实际的页面.

编辑2.0:

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

在此输入图像描述

编辑3.0:

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