我目前正在尝试学习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]);
}
}
}
答案 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值以满足您的需要