0

我目前正在努力学习UIScrollView. 作为一个练习,我只想要UIView带有显示文本的标签的 s,并且我希望这些视图包含在 s 中UIScrollView。为此,我有两个mutableArrays;一个将包含文本,另一个将包含UIViews。下面是初始化这些数组的方法。

- (NSMutableArray *)postViewsArray
{
    if (_postViewsArray == nil) _postViewsArray = [[NSMutableArray alloc] init];
    return _postViewsArray;
}

- (NSMutableArray *)postsArray
{
    if (_postsArray == nil) _postsArray = [[NSMutableArray alloc] init];
    return _postsArray;
}

接下来,我用值填充这两个数组。对于postsArray我只放置静态文本。但是对于postViewsArray我用作NSNull占位符。这是为了优化目的,尤其是内存管理,当我将来需要加载带有图像的视图时。下面是设置这些数组的方法。

- (void) setupPostsArray {
    [self.postsArray addObject:@"Hello"];
    [self.postsArray addObject:@"You are doing good"];
    [self.postsArray addObject:@"By this exercise"];
    [self.postsArray addObject:@"In scroll views, paging enabled :)"]; 
}

- (void) setupPostViewsArray {
    for (int i = 0; i < [self.postsArray count]; i++) {
        [self.postViewsArray addObject:[NSNull null]];
    } 
}

在那里,很简单。现在让我们进入更具挑战性的部分。因此,在loadMyPages方法中,首先我初始化 my scrollView,设置它contentSize,并将其添加为我的顶级视图的子视图,即self.view. 在这里,我还在创建可以滑动浏览的“页面”时进行迭代,它是内容、背景颜色。它在那里。

但是,当我运行该应用程序时,我只能看到一个view可以刷卡的。似乎还有 3 个views可以容纳在这个滚动视图中。我做了NSLogs 来检查page正在创建的 ssubviews并且它似乎工作正常,因为我在调试区域中看到了日志。请注意,view我可以看到的 具有 my 的最后一个值postArray。有朋友怀疑其他views 是重叠的,而不是并排查看。

在这里给我一些启发:)下面是我的loadMyPages方法,如果你们准备好迎接挑战,也许可以看看这个。

- (void) loadMyPages
    {
        NSLog(@"loads view");
        CGRect pagingScrollViewFrame = [[UIScreen mainScreen] bounds];

        self.pagingScrollView = [[UIScrollView alloc] initWithFrame:pagingScrollViewFrame];

        self.pagingScrollView.contentSize = CGSizeMake(pagingScrollViewFrame.size.width * [self.postsArray count], pagingScrollViewFrame.size.height);


        [self.view addSubview:self.pagingScrollView];

        // iteration to enumerate creating of UIViews
        for (int i = 0; i < [self.postsArray count]; i++) {

            NSLog(@"Creating views?");

            UIView *pageView = [self.postViewsArray objectAtIndex:i];

                if ((NSNull *) pageView == [NSNull null]) {


                    // create a new UIView
                    UIView *page = [[UIView alloc] initWithFrame:self.view.bounds];

                    page.backgroundColor = [UIColor lightGrayColor];

                    // set text label
                    self.postLabel.text = [self.postsArray objectAtIndex:i];

                    // add the label to the created UIView
                    [page addSubview:self.postLabel];

                    // then lastly, add each element of the postViewsArray as a subview of the pagingScrollView
                    [self.postViewsArray replaceObjectAtIndex:i withObject:page];

                    [self.pagingScrollView addSubview:[self.postViewsArray objectAtIndex:i]];

                    NSLog(@"this view %@ has this post value: %@", page, [page subviews]);
                    NSLog(@"subviews of scrollview: %@", [self.pagingScrollView subviews]);
            }
        }
    }
4

2 回答 2

1

您为每个视图提供的框架不正确,因此您的视图重叠: UIView *page = [[UIView alloc] initWithFrame:self.view.bounds];

因为每个视图都获得相同的帧。

取而代之的是,您应该提供如下框架:

UIView *page1 = [[UIView alloc] initWithFrame:self.view.bounds];

UIView *page2 = [[UIView alloc] initWithFrame:CGRectMake(page1.frame.origin.x+page1.frame.size.width, 0, page1.frame.size.width, page1.frame.size.height)];

等等。

希望你能得到我想要传达的东西。

在 For 循环之前创建一些 CGRect 变量。

CGRect theViewFrame = CGRectZero;

内部 for 循环提供页面框架并初始化 theViewFrame 如下:

page.frame = CGRectMake(theViewFrame.origin.x+self.view.bounds.size.width, 0, self.view.bounds.size.width, self.view.bounds.size.height);
    theViewFrame = pageView.frame;

因此,当每次循环迭代时, theViewFrame 将包含最新的视图帧。

于 2012-08-06T10:06:33.027 回答
1

根据我的理解,您希望水平布局视图,就像一副并排放置的卡片,然后从一个滚动到另一个,就像 iOS 默认的照片应用程序一样。

为此,每个视图的 x 原点差值必须等于视图框架或 scrollView 框架的宽度。但是您当前的代码

[[UIView alloc] initWithFrame:self.view.bounds]

为每个视图设置相同的原点,从而导致重叠。将您的代码更改为以下

[[UIView alloc] initWithFrame:(i*320), 0, yourWidth, yourHeight];

i因子将增加 x 值,将每个后续视图放置在前一个视图旁边。

注意:将 320 和 0 调整为 x、y 值以满足您的需要

于 2012-08-06T10:21:15.387 回答