Iphone UI在水平滚动视图中并排显示视图

Iphone UI在水平滚动视图中并排显示视图,iphone,ios,uiview,uiscrollview,Iphone,Ios,Uiview,Uiscrollview,我目前正在尝试学习UIScrollView。作为练习,我只希望UIViews带有显示文本的标签,我希望这些视图位于uicrollview中。为此,我有两个mutableArrays;一个包含文本,另一个包含UIViews。下面是初始化这些数组的方法 - (NSMutableArray *)postViewsArray { if (_postViewsArray == nil) _postViewsArray = [[NSMutableArray alloc] init]; ret

我目前正在尝试学习
UIScrollView
。作为练习,我只希望
UIView
s带有显示文本的标签,我希望这些视图位于
uicrollview
中。为此,我有两个
mutableArray
s;一个包含文本,另一个包含
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
I,我只放置了静态文本。但是对于
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]];
    } 
}

为每个视图提供的框架不正确,因此视图重叠: 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)];
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;
等等

希望你得到我想要传达的

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

CGRect theViewFrame = CGRectZero;
内部for循环提供页面框架并按如下方式初始化ViewFrame:

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)];
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;

因此,每次循环时,ViewFrame将包含最新的ViewFrame。

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

为此,每个视图的x原点差值必须等于视图边框或滚动视图边框的宽度。然而,您当前的代码

[[UIView alloc] initWithFrame:self.view.bounds]
为每个视图设置相同的原点,从而产生重叠。将代码更改为以下内容

[[UIView alloc] initWithFrame:(i*320), 0, yourWidth, yourHeight];
i
因子将增加x值,将每个后续视图放置在前一视图的旁边


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

我明白您的意思。这样,我就有了这样一个想法:将下一个
视图的原点设置为上一个
视图的右上角。你能帮我把它翻译成代码吗?你是说视图框=页面框架吗?已尝试此操作,但未首先显示创建的第一个
视图。我必须向右滑动才能看到创建的视图。感谢您的紧急响应!你有我想做的。我会试试这个。我用框架做了这个
[[UIView alloc]initWithFrame:CGRectMake(I*320,0,self.view.bounds.size.width,self.view.bounds.size.height)]
,现在关于
视图的问题似乎还可以。但是,我发现了另一个问题,在最后一个
视图中只显示了我的
postArray
的最后一个值。前三个
postArray
视图中仍然没有显示前三个
postArray
值。这仅仅是因为您将同一个self.postlab字段添加到所有视图中,并从postsArray更改其值。每次迭代都会覆盖self.postlab的上一个值,从而在字段中保留最后一个值。为每个视图创建多个PostLabel。此外,如果答案解决了您的问题,请接受它。=)谢谢,最后一件有点模糊的事情是创建多个标签。你的意思是我应该从对象库中再拖出3个标签吗?或者对于标签是否存在某种类型的
reuseIdentifier
?是否要在每个视图上正确设置标签?如果是这样,请在创建UIView的循环中以编程方式创建标签。