0

私のテーブルビューでは、多くのサブビューを持つカスタム セル、2 つの egoimageviews (URL を取得して Web から画像を取得し、後で使用するためにキャッシュする imageview のサブクラス)、リンク検出がオンになっているテキストビューを使用しています。 4 つのラベル、およびボタン。egoimageview と textview にタップ ジェスチャを追加しました。テキストビューの高さは、保持するテキストのサイズに従って計算されます。高さの計算は事前に十分に行われるため、ユーザーがスクロールしている間にその場で高さを計算しても、スクロールのパフォーマンスが影響を受けることはありません。このデータはすべて Web から取得され、テキストの高さとセルの高さが計算され、配列に格納されてから、tableview がサブビューとして追加されます。一部のセルでは、表示する画像がありません。そのような場合、フレームを cgrectzero に設定した後、自分の egoimageview を非表示にします。画像は iPhone の画面で約 170 px X 100 px を占め、それぞれ約 250 KB です。スクロールすると、スクロールがかなりぎくしゃくします。スロースクロールセルについて少し調査しましたが、これまでに次のことを実装しましたが、パフォーマンスが大幅に向上することはありませんでした:

  1. 高さは、heightforrow メソッドではなく、事前に十分に計算されます。
  2. セルの背景とそのサブビューの背景は不透明です。
  3. データ レイアウトは 2 つの方法で表示する必要があるため、2 つの類似した種類のカスタム セル クラスがありますが、いくつかの違いがあります。そのため、内容に応じて、返されるセル タイプが決定されますが、90% の場合のみです。最初の種類が使用されます。

私はこのぎくしゃくしたスクロールに本当に満足しておらず、複雑なレイアウトにもかかわらずバターをスムーズにスクロールできるようにウェブを探していましたが、これまでのところ何も役に立ちませんでした. 助けてください!

4

2 に答える 2

0

コードは

    - (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
if([type intValue] == POSTS) {
    Feed *feed = [postsArray objectAtIndex:indexPath.row];
    FeedCellFormattedDataObject *feedCellFormattedDataObject=[postsCellFormattedDataArray objectAtIndex:indexPath.row];
    if(feed.feedTypeIndex==0){//SIMPLEST CELL
        SimplestCell *simplestCell=[tableView dequeueReusableCellWithIdentifier:@"simplestcell"];
        if(!simplestCell){
            simplestCell=[[SimplestCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"simplestcell"];
            simplestCell.delegate=self;
            simplestCell.isInDetailedPostView=NO;
            simplestCell.selectionStyle = UITableViewCellSelectionStyleNone;
            [simplestCell.likeBtn addTarget:self action:@selector(likeButtonClicked:) forControlEvents:UIControlEventTouchUpInside];
        }
        simplestCell.cellIndex=indexPath.row;
        [simplestCell setDataWithFeed:feed andFeedCellFormattedDataObject:feedCellFormattedDataObject];
        return simplestCell;
    }
    if(feed.feedTypeIndex==1){//SIMPLEFEEDCELL WITH IMAGE
        SimpleFeedCell *simpleCellWithImage=[tableView dequeueReusableCellWithIdentifier:@"imagecell"];
        if(!simpleCellWithImage){
            simpleCellWithImage=[[SimpleFeedCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"imagecell"];
            simpleCellWithImage.delegate=self;
            simpleCellWithImage.isInDetailedPostView=NO;
            UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(photoOrVideoTapped:)];
            [simpleCellWithImage.feedImageView addGestureRecognizer:tapGesture];
            simpleCellWithImage.selectionStyle = UITableViewCellSelectionStyleNone;
            [simpleCellWithImage.likeBtn addTarget:self action:@selector(likeButtonClicked:) forControlEvents:UIControlEventTouchUpInside];
        }
        simpleCellWithImage.cellIndex=indexPath.row;
        [simpleCellWithImage setDataWithFeed:feed andFeedCellFormattedDataObject:feedCellFormattedDataObject];
        return simpleCellWithImage;
    }

    if(feed.feedTypeIndex==2){//SIMPLEFEEDCELL WITH VIDEO
        SimpleFeedCell *simpleCellWithVideo=[tableView dequeueReusableCellWithIdentifier:@"videocell"];
        if(!simpleCellWithVideo){
           simpleCellWithVideo=[[SimpleFeedCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"videocell"];
            simpleCellWithVideo.delegate=self;
            simpleCellWithVideo.isInDetailedPostView=NO;
            UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(photoOrVideoTapped:)];
            [simpleCellWithVideo.feedImageView addGestureRecognizer:tapGesture];
            simpleCellWithVideo.selectionStyle = UITableViewCellSelectionStyleNone;
            [simpleCellWithVideo.likeBtn addTarget:self action:@selector(likeButtonClicked:) forControlEvents:UIControlEventTouchUpInside];
            simpleCellWithVideo.playVideoImageView.hidden=NO;
        }
        simpleCellWithVideo.cellIndex=indexPath.row;
        [simpleCellWithVideo setDataWithFeed:feed andFeedCellFormattedDataObject:feedCellFormattedDataObject];
        return simpleCellWithVideo;
    }

    if(feed.feedTypeIndex==3){//LINKFEEDCELL
        LinkFeedCell *linkFeedCell=[tableView dequeueReusableCellWithIdentifier:@"linkcell"];
        if(!linkFeedCell){
            linkFeedCell=[[LinkFeedCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"linkcell"];
            linkFeedCell.delegate=self;
            linkFeedCell.isInDetailedPostView=NO;
            linkFeedCell.selectionStyle = UITableViewCellSelectionStyleNone;
            [linkFeedCell.likeBtn addTarget:self action:@selector(likeButtonClicked:) forControlEvents:UIControlEventTouchUpInside];

        }
        linkFeedCell.cellIndex=indexPath.row;
        [linkFeedCell setDataWithFeed:feed andFeedCellFormattedDataObject:feedCellFormattedDataObject];
        return linkFeedCell;
    }

}
else {
    EventCell * eventCell=(EventCell*)[tableView dequeueReusableCellWithIdentifier:@"eventcell"];
    if(!eventCell){
        eventCell=[[EventCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"eventcell"];
        eventCell.selectionStyle=UITableViewCellSelectionStyleGray;
    }
    [eventCell setCellDataWithEvent:[eventsArray objectAtIndex:indexPath.row]];
    return eventCell;
}

}

于 2013-02-06T17:55:05.333 に答える
0

設定データのコード

 //set data and properties
self.dateLabel.text=feed.when;
self.msgTextView.text=feed.message;
self.likesCountLabel.text=feedCellFormattedDataObject.likesString;
self.commentsCountLabel.text=feedCellFormattedDataObject.commentsString;
self.userImageView.imageURL=feedCellFormattedDataObject.posterPicURL;
self.feedImageView.tag=self.cellIndex;
self.feedImageView.imageURL=feedCellFormattedDataObject.imageURL;
self.likeBtn.tag=self.cellIndex;
if(feed.canUserLike){
    self.likeBtn.hidden=NO;
    [self.likeBtn setBackgroundImage:feedCellFormattedDataObject.likeButtonImage forState:UIControlStateNormal];
}
else self.likeBtn.hidden=YES;

//adjust frames on the fly
self.msgTextView.frame=feedCellFormattedDataObject.msgTextViewFrame;
self.feedImageView.frame=feedCellFormattedDataObject.feedImageViewFrame;
self.likeBtn.frame=feedCellFormattedDataObject.likeBtnFrame;
self.likesCountLabel.frame=feedCellFormattedDataObject.likesCountLabelFrame;
self.commentsCountLabel.frame=feedCellFormattedDataObject.commentsCountLabelFrame;
self.commentsImageView.frame=feedCellFormattedDataObject.commentsImageViewFrame;
self.bgView.frame=feedCellFormattedDataObject.bgViewFrame;
于 2013-02-06T18:10:07.180 に答える