0

だから私はUIScrollViewを備えたiPadアプリを持っています。スクロール ビューには一度に約 5 ~ 10 個の UIView が表示され、それらの UIView の内部には tableView があります。したがって、基本的に一度に表示される UITableView は 5 ~ 10 です。問題は、UIScrollView をスクロールすると、UITableView で reloadData が呼び出されることです。この場合、UITableView セルのテキストが設定されます。方法は次のとおりです。

if (shouldUpdateComment){
        shouldUpdateComment = NO;
        __block __weak AHCommentsTableViewCell * weakSelf = self;
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{

            NSString *commentsText = [NSString stringWithFormat:@"%@ %@", self.imageComment_.username_, self.imageComment_.text_];
            NSMutableAttributedString* attrStr = [[[NSMutableAttributedString alloc] initWithString:commentsText] autorelease];

            NSRange usernameRange = [commentsText rangeOfString:self.imageComment_.username_];
            if (usernameRange.location != NSNotFound){
                [attrStr setTextColor:[UIColor colorWithRed:86.0/255.0 green:134.0/255.0 blue:172.0/255.0 alpha:1.0] range:usernameRange];

            }

            NSString * url = [NSString stringWithFormat:@"userid://%@", self.imageComment_.id_];
            usernameRange = [commentsText rangeOfString:self.imageComment_.username_];
            if (usernameRange.location != NSNotFound){
                [weakSelf.commentsText_ addLink:[NSURL URLWithString:url] range:usernameRange];
            }

            NSRange range;
            range.location = 0;
            range.length = commentsText.length;

            [attrStr setFont:[UIFont fontWithName:@"HelveticaNeue" size:14] range:range];

            dispatch_async(dispatch_get_main_queue(), ^{
                [weakSelf.commentsText_ setAlpha:0.0];
                [weakSelf.commentsPostedTime_ setAlpha:0.0];
                [weakSelf.commentsText_ setFrameWidth:self.contentView.frameWidth - self.profilePicture_.frameWidth - kCommentsPadding];
                [weakSelf.commentsText_ setFrameHeight:weakSelf.imageComment_.commentHeight_ - 30];
                [weakSelf.commentsText_ setAttributedString:attrStr];

                dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
                    [weakSelf parseTagsInComment:commentsText];
                });

                NSString *timePosted = [NSString timestampToString:weakSelf.imageComment_.createdTime_];
                CGSize commentsTimeSize = [timePosted sizeWithFont:weakSelf.commentsPostedTime_.font constrainedToSize:CGSizeMake(weakSelf.commentsText_.frameWidth, 50)];
                [weakSelf.commentsPostedTime_ setText:timePosted];
                [weakSelf.commentsPostedTime_ setFrameWidth:commentsTimeSize.width];
                [weakSelf.commentsPostedTime_ setFrameHeight:commentsTimeSize.height];
                [weakSelf.commentsPostedTime_ setFrameY:weakSelf.commentsText_.frameY + weakSelf.commentsText_.frameHeight];
                [weakSelf.commentsPostedTime_ setFrameX:weakSelf.commentsText_.frameX];

                [UIView animateWithDuration:0.3 animations:^{
                    [weakSelf.commentsText_ setAlpha:1.0];
                    [weakSelf.commentsPostedTime_ setAlpha:1.0];
                }];
            });

        });

    }

上記の方法は、計測器でプロファイリングしようとしたため、重いです。スクロールビューのスクロール中に実行すると、非常に遅くなります。だから私がしたことは、スクロールビューがスクロールを停止して上記のメソッドを呼び出すまで待っていたことです.問題は、それが非常に悪いUXにつながることです. 何か案は?

4

1 に答える 1

0

UI の変更はメイン スレッドでのみ実行できます。つまり、テキストを変更したい場合、UIControl のフレームを変更する場合などは、メイン スレッドで実装する必要があります。

それがUIKitフレームワークがサポートするものです

于 2012-07-17T17:26:15.890 に答える