1

私はこのような写真でユーザーの連絡先を表示する簡単なアプリを構築しています -

アプリ

連絡先はそれぞれ配置されたサブビューであり、内部に別のサブビューがあり、UIImageView を含み、角の丸い画像と UILabel を生成します。

ただし、iPhone 4/4s と iPhone 5 の両方でスクロールがかなり途切れ途切れになります。また、途切れ途切れは一定のようです。連絡先が 8 人であろうと 500 人であろうと関係ありません。

これがなぜなのか誰か知っていますか?このグリッドを生成したアルゴリズムを以下に示します。設定していない UIScrollView などの特定のプロパティはありますか?

- (void) generateContactGrid
{
    CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(self.addressBook);
    CFIndex nPeople = ABAddressBookGetPersonCount(self.addressBook);


    int peopleInARow = 0;
    int maxPeopleInARow = 3;
    int positionFromTop = 20;
    int IMAGE_SIZE = 70;
    float animationOffset = .5;
    float animationOffsetChange = .3;
    float animationDuration = .5;
    int scaleOffset = 40;
    int screenWidth = 320;
    int startingPositionFromLeft = 26;
    int positionFromLeft = startingPositionFromLeft;
    int topOffset = 40;
    int leftOffset = 26;
    int numberOfRows = 0;


    UIView *contactContainer;
    UIImage* image;
    CALayer *l;
    NSString *name;
    NSString *lastName;
    NSString *firstName;
    UIImageView *newimageview;
    UILabel *label;
    UIView *contactImageContainer;



    for ( int i = 0; i < nPeople; i++ )
    {
        ABRecordRef person = CFArrayGetValueAtIndex(allPeople, i);
        firstName = (__bridge_transfer NSString*)ABRecordCopyValue(person,kABPersonFirstNameProperty);
        lastName = (__bridge_transfer NSString*)ABRecordCopyValue(person, kABPersonLastNameProperty);
        name = [NSString stringWithFormat:@"%@ %@", firstName, lastName];

        if(ABPersonHasImageData(person)){
            NSLog(@"Current Contact Being Generated: %@", name);
            image = [UIImage imageWithData:(__bridge NSData *)ABPersonCopyImageData(person)];

            NSLog(@"Contact's Position From Left: %i", positionFromLeft);
            newimageview = [[UIImageView alloc] initWithFrame:CGRectMake(-scaleOffset/2, -scaleOffset/2, IMAGE_SIZE+scaleOffset, IMAGE_SIZE+scaleOffset)];
            newimageview.contentMode = UIViewContentModeScaleAspectFit;
            [newimageview setImage: image];
            contactContainer = [[UIView alloc] initWithFrame:CGRectMake(positionFromLeft, positionFromTop + 20, IMAGE_SIZE, 200)];
            contactImageContainer = [[UIView alloc] initWithFrame:CGRectMake(0, 0, IMAGE_SIZE, IMAGE_SIZE)];
            contactImageContainer.clipsToBounds = YES;

            l = [contactImageContainer layer];
            [l setMasksToBounds:YES];
            [l setCornerRadius:IMAGE_SIZE/2];

            [l setBorderWidth:0.0];
            [l setBorderColor:[[UIColor colorWithRed:234.0/255.0 green:234.0/255.0 blue:234.0/255.0 alpha:.6] CGColor]];


            [contactImageContainer addSubview:newimageview];

            [contactContainer addSubview:contactImageContainer];

            label =  [[UILabel alloc] initWithFrame: CGRectMake(0, IMAGE_SIZE + 10, IMAGE_SIZE, 20)];
            label.text = firstName;
            label.backgroundColor = [UIColor colorWithRed:0/255.0 green:0/255.0 blue:0/255.0 alpha:0];
            label.textColor = [UIColor whiteColor];
            [label setTextAlignment:NSTextAlignmentCenter];
            [label setFont:[UIFont fontWithName:@"Arial-BoldMT" size:14]];
            [contactContainer addSubview:label];


            contactContainer.alpha = 0;

            [UIView beginAnimations:nil context:nil];
            [UIView setAnimationDuration:animationDuration];
            [UIView setAnimationDelay:animationOffset];
            animationOffset+= animationOffsetChange;
            [UIView setAnimationCurve:UIViewAnimationCurveEaseOut];

            contactContainer.alpha = 1;
            CGRect temp = contactContainer.frame;
            temp.origin.y = positionFromTop;
            contactContainer.frame = temp;

            [UIView commitAnimations];

            if(peopleInARow >= 2){
                positionFromTop += IMAGE_SIZE + topOffset;
                peopleInARow = 0;
                positionFromLeft = startingPositionFromLeft;
                numberOfRows++;

            } else {
                peopleInARow += 1;
                positionFromLeft += IMAGE_SIZE + leftOffset;
            }

            [self.scrollView addSubview:contactContainer];
            [self.scrollView bringSubviewToFront:contactContainer];


        }

    }

    NSLog(@"%i", numberOfRows);

    self.scrollView.contentSize = CGSizeMake(screenWidth, 150 * numberOfRows);

}
4

1 に答える 1

2

Instruments を使用して、アプリが遅くなる正確な原因を測定します。他のすべては単なる推測です。

しかし、とにかく推測します。これは、UIImageViews に適用するマスキングである可能性が最も高いです。それを無効にしてみて、まだ遅いかどうかを確認してください(もちろん、測定を意味します)。それが本当に原因である場合は、2 つの方法を試すことができます。まず、マスクされたレイヤーの shouldRasterize プロパティを設定し、それで十分かどうかを確認できます。ただし、レイヤーが大幅に変更された場合、これは事態を悪化させる可能性があります。もう 1 つのオプションは、レイヤーを使用する代わりに、これらのマスクされた画像を Core Graphics でレンダリングすることです。

于 2013-06-01T19:15:36.560 に答える