UIViews在水平滚动视图中并排

时间:2012-08-06 09:55:37

标签: iphone ios uiview uiscrollview

我目前正在尝试学习UIScrollView。作为练习,我只想要UIView s带有显示文本的标签,我希望这些视图在UIScrollView范围内。为此,我有两个mutableArray;一个将包含文本,另一个将包含UIView s。下面是初始化这些数组的方法。

- (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方法中,首先我初始化我的scrollView,将其设置为contentSize,然后将其添加为我的顶级视图的子视图,即self.view。在这里,我也在迭代创建我可以刷过的“页面”,它的内容,背景颜色。它就是。

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

在这里为我提供了一些亮点:)下面是我的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]);
            }
        }
    }

2 个答案:

答案 0 :(得分: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;

inside for循环提供页面框架并按如下方式初始化ViewFrame:

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都将包含最新的视图框架。

答案 1 :(得分:1)

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

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

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

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

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

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

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