我怎样才能使这个与 UIScrollView 一起工作?

发布于 2024-12-02 05:01:48 字数 2395 浏览 2 评论 0原文

我在 UIScrollView 中动态插入 1 到 300 个按钮(作为子视图)。目前,这些按钮排列得很好,但没有像我希望的那样滚动。它只是水平滚动,没有分页效果。理想情况下,我希望它的工作方式是:

  • 每个“页面”最多显示 48 个按钮
  • 当向右滚动时,显示带有 48 个附加按钮的下一个“页面”

我的代码:

-(void)populateScrollView:(NSMutableArray *)colors {
// Properties
NSInteger count = 0;
NSInteger rowsize = 48;
CGFloat pageNum = 6;
CGFloat pageWidth = scrollView.frame.size.width;
CGFloat pageHeight = scrollView.frame.size.height;
CGFloat visibleWidth = 465;

myButtons = [[NSMutableArray alloc]init];

// Clear the subviews if any
for (UIView *subview in scrollView.subviews) {
    [subview removeFromSuperview];
}

for (Color *element in colors) {
    // Set the button properties    
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    UIImage *image = [UIImage imageNamed:@"color_overlay.png"];
    [button setImage:image forState:UIControlStateNormal];
    [button setImage:image forState:UIControlStateHighlighted];
    div_t temp = div(count, rowsize);
    button.frame = CGRectMake(52 * temp.rem , 52*temp.quot, 52, 52);
    button.tag = count++;
    UIImage *effect = [UIImage imageNamed:element.image_resource];
    effectImage = [[UIImageView alloc] initWithImage:effect]; 
    effectImage.frame = CGRectMake(52 * temp.rem , 52*temp.quot, 52, 52);

    // Color the graphic if color available. If not, load the image
    unsigned result = 0;
    if ([element.hex_value length] > 1){
        NSScanner *scanner = [NSScanner scannerWithString:element.hex_value];
        [scanner scanHexInt:&result];
        button.backgroundColor = UIColorFromRGB(result);
    }
    else {
        effectImage.image = effect;
    }
    // Set actions for the color
    [button addTarget:self action:@selector(changeGraphicColor:) forControlEvents:UIControlEventTouchUpInside];
    [myButtons addObject:button];

    for (UIButton *myButton in myButtons){
        [scrollView insertSubview:effectImage atIndex:1];
        [scrollView insertSubview:myButton atIndex:2];   
    }
}
// Set scrollView contentSize and create pages:
CGFloat leftShift=floor(((visibleWidth-pageWidth)/2)/pageWidth)*pageWidth;
CGFloat contentSizeReduction=2*leftShift;

scrollView.contentSize = CGSizeMake(pageNum*pageWidth-contentSizeReduction,pageHeight);

[myButtons removeAllObjects];
[myButtons release];

}

我正在思考我的方式添加按钮将不允许我实现我想要完成的任务。你们认为我在这里做错了什么?

I'm inserting dynamically anywhere from 1 to 300 buttons inside a UIScrollView(as subviews). Currently, the buttons line up nicely but is not scrolling as I'd like them to. It just scrolls horizontally without a paging effect. Ideally, they way I'd like it to work is:

  • Display a max of 48 buttons per "page"
  • When scrolling to the right, show next "page" with 48 additional buttons

My code:

-(void)populateScrollView:(NSMutableArray *)colors {
// Properties
NSInteger count = 0;
NSInteger rowsize = 48;
CGFloat pageNum = 6;
CGFloat pageWidth = scrollView.frame.size.width;
CGFloat pageHeight = scrollView.frame.size.height;
CGFloat visibleWidth = 465;

myButtons = [[NSMutableArray alloc]init];

// Clear the subviews if any
for (UIView *subview in scrollView.subviews) {
    [subview removeFromSuperview];
}

for (Color *element in colors) {
    // Set the button properties    
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    UIImage *image = [UIImage imageNamed:@"color_overlay.png"];
    [button setImage:image forState:UIControlStateNormal];
    [button setImage:image forState:UIControlStateHighlighted];
    div_t temp = div(count, rowsize);
    button.frame = CGRectMake(52 * temp.rem , 52*temp.quot, 52, 52);
    button.tag = count++;
    UIImage *effect = [UIImage imageNamed:element.image_resource];
    effectImage = [[UIImageView alloc] initWithImage:effect]; 
    effectImage.frame = CGRectMake(52 * temp.rem , 52*temp.quot, 52, 52);

    // Color the graphic if color available. If not, load the image
    unsigned result = 0;
    if ([element.hex_value length] > 1){
        NSScanner *scanner = [NSScanner scannerWithString:element.hex_value];
        [scanner scanHexInt:&result];
        button.backgroundColor = UIColorFromRGB(result);
    }
    else {
        effectImage.image = effect;
    }
    // Set actions for the color
    [button addTarget:self action:@selector(changeGraphicColor:) forControlEvents:UIControlEventTouchUpInside];
    [myButtons addObject:button];

    for (UIButton *myButton in myButtons){
        [scrollView insertSubview:effectImage atIndex:1];
        [scrollView insertSubview:myButton atIndex:2];   
    }
}
// Set scrollView contentSize and create pages:
CGFloat leftShift=floor(((visibleWidth-pageWidth)/2)/pageWidth)*pageWidth;
CGFloat contentSizeReduction=2*leftShift;

scrollView.contentSize = CGSizeMake(pageNum*pageWidth-contentSizeReduction,pageHeight);

[myButtons removeAllObjects];
[myButtons release];

}

I'm thinking the way I'm adding the buttons won't allow me to implement what I am trying to accomplish. What do you guys think I'm doing wrong here?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

云仙小弟 2024-12-09 05:01:48

您是否将scrollView.pagingEnabled设置为YES?

Did you set scrollView.pagingEnabled to YES?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文