1

我正在使用 GCD 为我的滚动视图加载图像,但不是跟随我创建的帧,它只制作一个图像在其中闪烁的帧。这是我的代码:

//Create the array    
-(void)awakeFromNib {

images = [NSMutableArray arrayWithObjects: [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"imageOne" ofType:@"png"]], [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"imageTwo" ofType:@"png"]], [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"imageThree" ofType:@"png"]],nil];

}

 //Populate scrollview
-(void)populate {

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);


scrollview.pagingEnabled = YES;
scrollview.backgroundColor = [UIColor clearColor];
scrollview.clipsToBounds = YES;
scrollview.delegate = self;

[scrollview setContentSize:CGSizeMake(2 * scrollview.frame.size.width, scrollview.frame.size.height)];

int number = [images count] ;
NSLog(@"%i",images);

int rowTwoInt = 0;
int rowThreeInt = 0;
int rowFourInt = 0;

for (int i = 0; i < number; i++) {



    if (i <= 3) {

        finalFrame = CGRectMake( i*(80), 12, 80, 80);
    }

    if (i == 4) {
        finalFrame = CGRectMake(0, 95, 80, 80);
    }
    if ((i >4) && (i <= 7)) {
        rowTwoInt = rowTwoInt + 80;
        finalFrame = CGRectMake(rowTwoInt, 95, 80, 80);
    }

    if (i == 8) {
         finalFrame = CGRectMake(0, 178, 80, 80);
    }
    if ((i > 8) && (i <= 11)) {
        rowThreeInt = rowThreeInt + 80;
        finalFrame = CGRectMake(rowThreeInt, 178, 80, 80);
    }


    if (i == 12) {
        finalFrame = CGRectMake(0, 261, 80, 80);
    }
    if ((i > 12) && (i <= 15)) {
        rowFourInt = rowFourInt + 80;
        finalFrame = CGRectMake(rowFourInt, 261, 80, 80);
    }


    IconButton = [UIButton buttonWithType:UIButtonTypeCustom];
    IconButton.frame = CGRectMake(0, 0, 57, 57);
    IconButton.center = CGPointMake(40, 29);

    [IconButton addTarget:self action:@selector(Selected:) forControlEvents:UIControlEventTouchUpInside];
    IconButton.tag = i;



    dispatch_async(queue, ^{
        UIImage *icon = [images objectAtIndex:i];

        dispatch_sync(dispatch_get_main_queue(), ^{
            [IconButton setImage:icon forState:UIControlStateNormal];

        });
    });



    [cell addSubview:IconButton];


      cell = [[UIView alloc] initWithFrame:finalFrame];
 [scrollview addSubview:cell];

那我做错了什么?我是 GCD 的新手,所以可能与此有关。另外,如果您看到提高 UIScrollView 性能的方法,请告诉我。

4

1 回答 1

2

我怀疑您已声明IconButton为实例变量、static变量或全局变量。

每次通过循环时,您都会更改IconButton. 到您的十二个队列块执行时,IconButton将设置为其最终值 - 对您创建的最后一个按钮的引用。所有块都使用实例(static或全局)IconButton变量,因此所有块都更新相同的最终按钮。

创建一个局部变量来引用按钮,并在循环中使用该局部变量:

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
IconButton = button;
IconButton.frame = CGRectMake(0, 0, 57, 57);
...

dispatch_async(queue, ^{
    UIImage *icon = [images objectAtIndex:i];

    dispatch_sync(dispatch_get_main_queue(), ^{
        [button setImage:icon forState:UIControlStateNormal];

    });
});

每个块将在创建块时捕获局部变量的值,因此每个块将捕获对不同按钮的引用。

于 2013-04-05T23:56:35.420 回答