在ScrollView中创建动态UIButton的正确方法?

时间:2013-04-22 05:40:11

标签: iphone ios objective-c cocoa-touch

我是iOS发展的新手。

我有一个基于导航的应用程序,在我的应用程序中,我使用for loop创建了动态按钮。 我在UITextField中有两个FirstViewController s()。当用户输入值时,请点击OK Button 传递给anOtherViewController。在anOtherViewController中,我必须根据行和列值创建一个逻辑来创建所有按钮。

MyLogical Code:

for (int i = 1 ; i <= rows; i++)
{
    for (int j = 1 ; j <= columns ; j++)
    {
        NSString *btnTitle = [NSString stringWithFormat:@"%d",buttonCount];
        self.btnCount = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        self.btnCount.tag = [btnTitle intValue];
        [self.btnCount setTitle: btnTitle forState: UIControlStateNormal];
        [self.btnCount addTarget:self action:@selector(btnCountPressed:) forControlEvents:UIControlEventTouchUpInside];
        self.btnCount.frame = CGRectMake(162+changedX, 60+changedY, 43, 43);
        [self.scrollView addSubview:self.btnCount];

        [self.listOfbtnCount addObject:btnTitle];

        changedY = changedY + 50;
        buttonCount = buttonCount + 1;
    }
    changedX = changedX + 55;
    if (i == rows)
        widthScView = changedX;

    if (heightScView == 0)
        heightScView = changedY;

    changedY = 5;
}

我的ScreenShot:

enter image description here

一切正常,但我的问题是,如果我输入的值,那么 40 about < / em>)然后我的应用程序需要更多时间来创建动态按钮。该问题仅与创建按钮所需的时间有关。

有没有办法更快地创建按钮?我还需要知道我的代码是否对内存管理有害?请帮我解决这个问题。

有关信息: 我没有生成任何错误,我只发出了创建按钮的耗时过程。

先谢谢。

3 个答案:

答案 0 :(得分:7)

您应该使用UICollectionView

UICollectionViewUITableView非常相似,因为它会管理屏幕上显示的单元格,包括滚动,并且会根据需要向新数据源询问其数据源。您还可以回收单元格,因此您只需要创建足够的内容以及一些额外的内容。这应该真正提高性能,尤其是在滚动时。

Apple有一些sample code using UICollectionView here,在2012 WWDC Videos中观看介绍集合视图会让您有个良好的开端。

  

我的问题是,如果我输入的行和列的值超过40

40行40列会给你1600个按钮,其中大部分都不需要存在。通过管理屏幕上需要哪些单元格,UICollectionView会将其减少到大约八十(通过屏幕截图判断)。你应该以这种方式看到更好,更好的表现。

一旦配置了集合视图(您可以在代码或Interface Builder中执行),

UICollectionView也将简化按钮的定位,您不需要任何自己的代码来计算位置按钮。

答案 1 :(得分:0)

在这里根据您的要求实现您的逻辑..

    int imageIndex = 0;

    int yOffset = 4;//set offset which you want...

    while (imageIndex < rows)        
    {
        int yPos =  7 + yOffset * 30; // set distance in height between two raws

        for(int i = 0; i < columns; ++i)
        {
            CGRect  rect = CGRectMake((0 + i * 80), yPos, 80, 31);**// here set frame of every button with different x and y postion// here width of button is 80 and height is 31**

            if (imageIndex < rows) {


                UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
                button.frame = rect;
                button.tag = imageIndex;
                [button addTarget:self 
                           action:@selector(btnTemp_Clicked:)
                 forControlEvents:UIControlEventTouchDown];

                [button setTitle:[NSString stringWithFormat:@"%d",imageIndex] forState:UIControlStateNormal];
                [button.titleLabel setFont:[UIFont fontWithName:@"Helvetica-Bold" size:12]];

//                [button.titleLabel setTextColor:[UIColor blueColor]];
                [button setTitleColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"circle03.jpg"]] forState:UIControlStateNormal ];                
                [button setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted ];

                [button setNeedsDisplay];

                [yourScrollView addSubview:button];

            }
            ++imageIndex;
        }
        ++yOffset;
    }

查看我输出的屏幕..

enter image description here

答案 2 :(得分:0)

试试这个方法

    -(void)ScrollViewSetting {

        scrollview.scrollEnabled=YES;
        scrollview.userInteractionEnabled=YES;

        TotalStyleX=25;
        TotalStyleY=18;

        int count=0;
        int px=0;
        int py=0;


        for (int i=1; i<=TotalStyleX; i++) {
            px=0;
            for (int j=1; j<=TotalStyleY; j++) {
                count++;

                UIButton *btn1=[[UIButton alloc] init];

                btn1.tag = count;
                btn1.frame=CGRectMake(px+10, py+10, 300, 380); //you can set your height and width your x and y position
                [scrollview addSubview:btn1];

                px=px+320;     
            }
            py=py+400;

        }
        [scrollview setContentSize:CGSizeMake(px, py)];

    }