簡體   English   中英

如何將5個不同的頭像應用於5個不同的UIButton?

[英]How do I apply 5 different avatars to 5 different UIButtons?

我正在使用for循環創建5個UIButton,並想在UIButton上放置5個不同的頭像。 但是,只有一個頭像填充了所有5個按鈕。

我構建的代碼如下所示,

    // create a subview for avatar buttons
    UIView *avatarView = [[UIView alloc] init];
    avatarView.frame = CGRectMake(20, 125, 280, 100); // don't mess with these values.
//    avatarView.layer.borderColor = [UIColor redColor].CGColor;
//    avatarView.layer.borderWidth = 3.0f;
    [self.view addSubview:avatarView];

    UIScrollView *avatarScroll = [[UIScrollView alloc] initWithFrame:CGRectMake(0,0, self.view.frame.size.width, self.view.frame.size.height)];
    avatarScroll.contentSize = CGSizeMake(500, 500);
    avatarScroll.scrollEnabled = YES;
    [avatarView addSubview:avatarScroll];


    // fetch Data from Core Data
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Account" inManagedObjectContext:_managedObjectContext];
    [fetchRequest setEntity:entity];

    // fetch records and handle error
    NSError *error;
    NSArray *results = [_managedObjectContext executeFetchRequest:fetchRequest error:&error];

    // sort results array by lastLogin
    NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"lastLogin" ascending:NO];
    NSArray *sortedArray = [NSArray arrayWithObject:sort];
    NSArray *sortedArray2 = [results sortedArrayUsingDescriptors:sortedArray];
    // how to remove values from NSArray
    NSArray *lastLoginArray = [sortedArray2 valueForKey:@"lastLogin"];
//    NSLog(@"lastLoginArray = %@",lastLoginArray);
    // make an array that only hold 5 values
//    NSArray *last5LoginArray;
//    for (int i=5; i<[lastLoginArray count]; i++) {
//        [last5LoginArray addObject:[lastLoginArray objectAtIndex:i]];
//    }
//    NSLog(@"last5LoginArray = %@",last5LoginArray);
//    NSArray *last5LoginArray = [NSArray arrayWithObjects:lastLoginArray count:4];
//    NSArray *last5LoginArray = [NSArray arrayByAddingObjectsFromArray:lastLoginArray count:4];
    NSMutableArray *last5LoginArray = [[NSMutableArray alloc] initWithArray:[lastLoginArray subarrayWithRange:NSMakeRange(0, 5)] ];
    NSLog(@"last5LoginArray = %@",last5LoginArray);

//    NSLog(@"sortedArray2 = %@",sortedArray2);

    CGFloat staticX = 0;
    CGFloat staticWidth = 80;
    CGFloat staticHeight = 80;
    CGFloat staticPadding = 5;

    // need to put the avatars stored in sortedArray2 in the scrollView
    for ( int i = 0; i < 5; i++) {
        // do additional loading for avatars
        UIButton *avatarButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        // the last two values control the size of the button
//        avatarButton.frame = CGRectMake(0, 0, 80, 80);
        [avatarButton setFrame:CGRectMake((staticX + (i * (staticHeight + staticPadding))),5,staticWidth,staticHeight)];
        // make corners round
        avatarButton.layer.cornerRadius = 40; // value varies -- // 35 yields a pretty good circle.
        avatarButton.clipsToBounds = YES;
        // create a stock image
        UIImage *btnImage = [UIImage imageNamed:@"HomeBrewPoster1.jpg"];
        Account *anAccount;
        for ( anAccount in results) {
            if([last5LoginArray containsObject:anAccount.lastLogin]) {
                NSLog(@"anAccount.lastLogin = %@",anAccount.lastLogin);
                UIImage *avatarImg = [UIImage imageWithData:anAccount.avatar ];
                // apply avImg to btn
                [avatarButton setBackgroundImage:avatarImg forState:UIControlStateNormal];
            }
        }
        if (btnImage == nil) {
            NSLog(@"can't find HomeBrewPoster1.jpg");
            // apply stock image to button(s)
            [avatarButton setBackgroundImage:btnImage forState:UIControlStateNormal];
        } else {

        }
    // this should add 5x buttons
    [avatarScroll addSubview:avatarButton];
    }

您最里面的for-in循環始終將最后一個匹配的頭像設置為按鈕,因為i的當前值與最里面的循環所做的絕對沒有區別。

您應該將嵌套循環移到第一個循環之外以預先准備五個化身,然后使用i索引到化身數組中,如下所示:

NSMutableArray *avatars = [NSMutableArray arrayWithCapacity:5];
for ( anAccount in results) {
    if([last5LoginArray containsObject:anAccount.lastLogin]) {
        NSLog(@"anAccount.lastLogin = %@",anAccount.lastLogin);
        UIImage *avatarImg = [UIImage imageWithData:anAccount.avatar ];
        [avatars addObject:avatarImg];
    }
}
NSAssert(
    avatars.count == last5LoginArray.count
,   @"The loop is expected to find as many avatars as there are items in last5LoginArray"
);
for ( int i = 0; i < 5; i++) {
    ...
    // Check that we have enough logins
    if (i < last5LoginArray.count) {
        [avatarButton setBackgroundImage:avatars[i] forState:UIControlStateNormal];
    }
}

將按鈕聲明為數組

NSArray *arrImages = [NSArray arrayWithObjects:@"1.jpg",@"2.jpg",@"3.jpg",@"4.jpg",@"5.jpg", nil];
UIButton *button[5];
button[i] = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[button[i] addTarget:self action:@selector(aMethod:) forControlEvents:UIControlEventTouchUpInside];
[button[i] setBackgroundImage:[UIImage imageNamed:[arrImages objectAtIndex:i]] forState:UIControlStateNormal];
[button[i] setTitle:@"Title" forState:UIControlStateNormal];
button[i].frame = CGRectMake(80.0, 210.0, 160.0, 40.0);
[avatarScroll addSubview:button[i]];

您可以將圖像命名為“ HomeBrewPoster0”,“ HomeBrewPoster1”等,並添加以下內容以在循環中選擇合適的圖像:

 UIImage *btnImage = [UIImage imageNamed:[NSString stringWithFormat:@"HomeBrewPoster%ld.jpg", i]];   

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM