这里有几件事:
我有一个带有三个水平 UIScrollViews 的 UIView
你应该只有一个 UIScrollView
。它可能有 3页内容,但应该只有一个启用分页的滚动视图。
我将如何在第二个视图中加载按钮,而不是在第一个视图中?
您真的不想加载所有三页按钮吗?这样,如果用户从第 2 页开始并向左滚动,第 1 页将加载其按钮。如果他们向右滚动,页面 3 将已经加载了它的按钮。
如果你真的真的觉得你需要推迟加载下一页的按钮,直到用户开始滚动,你可以实现UIScrollViewDelegate
协议,并检测滚动scrollViewDidScroll:
。当滚动开始时,您将不得不加载新按钮。
但是,我不会推荐这个。 像这样按需加载可能会使您的滚动更加滞后(如果您不注意性能),并且按钮通常不是大内存用户,所以我认为您可以轻松地始终加载所有 3 页按钮.
- (void)createButton
{
float xButton = 10.0;
NSArray *buttonTitles = @[@"foo", @"bar"];
for (int i = 0; i < 2; i++) {
UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
button.frame = CGRectMake(xButton, 10.0, 100.0, 50.0);
/* button setup here */
xButton += 200;
}
}
我不认为您希望xButton
每次迭代都增加 200 点。SpringBoard 不会像这样隔开它的按钮。我曾经构建了一些模仿 SpringBoard 布局的东西,初始化按钮的代码是这样的:
const int PADDING = 4;
const int SCREEN_WIDTH = 320;
const int SCREEN_HEIGHT = 411;
const int SPACING = (SCREEN_WIDTH - (4 * 57)) / 5; // 5 spaces between 4 columns
float x = SPACING;
float y = SPACING;
int index = 0;
int page = 0;
for (NSString* title in buttonTitles) {
UILabel* btnLabel = [[UILabel alloc] initWithFrame: CGRectMake(x, y + 57 + PADDING, 57, 20)];
btnLabel.text = title;
btnLabel.font = [UIFont boldSystemFontOfSize: 12.0];
btnLabel.shadowColor = [UIColor darkGrayColor];
btnLabel.shadowOffset = CGSizeMake(1, 1);
btnLabel.textColor = [UIColor whiteColor];
btnLabel.opaque = NO;
btnLabel.backgroundColor = [UIColor clearColor];
btnLabel.textAlignment = UITextAlignmentCenter;
[self.scrollView addSubview: btnLabel];
UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
button.frame = CGRectMake(x, y, 57, 57);
// NOTE: my code uses labels beneath buttons, not button titles
//[button setTitle:title forState:UIControlStateNormal];
[button addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
[self.scrollView addSubview:button];
// index tag helps us determine which button was pressed later
[button setTag:index];
// I keep a NSMutableSet of all the buttons
[self.buttons addObject: button];
if ((x + (2 * 57) + SPACING) > (SCREEN_WIDTH * (page + 1))) {
// new row
x = SCREEN_WIDTH * page + SPACING;
if ((y + (2 * 57) + SPACING) > SCREEN_HEIGHT) {
// new page (to the right of the last one)
page++;
y = SPACING;
x = SCREEN_WIDTH * page + SPACING;
} else {
y += 57 + PADDING + 20 + SPACING;
}
} else {
x += 57 + SPACING;
}
index++;
}
// set the virtual scrollView size to allow paging/scrolling horizontally
self.scrollView.contentSize = CGSizeMake(SCREEN_WIDTH * (page + 1), SCREEN_HEIGHT);
在我的代码中,我在Touch Up Inside事件上触发了按钮单击回调,因为我认为这会带来更好的用户体验。
我还在按钮下方添加了标签,而不是按钮的一部分(同样,模仿 SpringBoard 本身)。btnLabel
如果您愿意,可以删除该代码 ( )。
此外,为了让我的第二个视图在我启动应用程序时首先显示,需要做什么?
如果您有一个滚动视图,并且想从第 2 页开始,请使用以下内容中的currentPageUIPageControl
:
- (void)viewWillAppear: (BOOL) animated {
[super viewWillAppear: animated];
self.pageControl.currentPage = 1; // for page '2'
}
注意:我似乎记得 57 点实际上并不是 SpringBoard 显示图标的大小。它类似于大小,忽略阴影/边缘效果,我认为这使总大小达到 60 点。无论如何,你可以玩它。