1

UIview (ヘッダーとして機能)、UIImage、および 10 個の UILabels を含むサブビューを作成します。これらを UICollectionView にセルとして入れています。

完全に設計すると、スムーズにスクロールしません。すべての UILabels を削除すると、スムーズにスクロールします。

UICollectionView がオンデマンドで読み込まれるのが遅いため、新しいセルが必要になると、それを描画する必要があり、メインスレッドがロックされると思います。

iOSがそれらを作成するのに処理するには多すぎるというだけの問題ですか? もしそうなら、それにテキストを入れる別の方法はありますか?

私の細胞がどのように見えるか:

ここに画像の説明を入力

ここに DatasetFilterListPanelView があります。これにより、UICollectionViewCell に入れた UIView が作成されます。UICollectionViewを使用する前にこれを作成したため、このようにしました。

@implementation DatasetFilterListPanelView

-(id)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {

        self.translatesAutoresizingMaskIntoConstraints = FALSE;

        UIView *contentView = [self createContentView];

        [self addSubview:contentView];

        [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[contentView]|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(contentView)]];
        [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[contentView]|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(contentView)]];
    }

    return self;
}

-(UIView *) createContentView {
    UIView *contentView = [[UIView alloc] initWithFrame:self.frame];
//    contentView.translatesAutoresizingMaskIntoConstraints = FALSE;
    contentView.backgroundColor = [UIColor myDarkGrayColor];

    UIView *headerView = [self createHeaderView];

    [contentView addSubview:headerView];

    [contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[headerView]|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(headerView)]];
    [contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[headerView]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(headerView)]];

    UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"gear12.png"]];
    imageView.translatesAutoresizingMaskIntoConstraints = FALSE;
    imageView.backgroundColor = [UIColor blueColor];
    self.imageView = imageView;

    [imageView addConstraint:[NSLayoutConstraint constraintWithItem:imageView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:imageView attribute:NSLayoutAttributeWidth multiplier:1 constant:0]];

    [contentView addSubview:imageView];

    [contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[imageView]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(imageView)]];
    [contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[headerView]-[imageView]-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(headerView, imageView)]];

    UILabel *acresLabel = [self createLabelWithTitle:@"Label01:" andFont:[UIFont fontWithName:HELVETICA_FONT_STYLE_BOLD size:12]];
    [contentView addSubview:acresLabel];

    UILabel *addedLabel = [self createLabelWithTitle:@"Label02:" andFont:[UIFont fontWithName:HELVETICA_FONT_STYLE_BOLD size:12]];
    [contentView addSubview:addedLabel];

    UILabel *typeLabel = [self createLabelWithTitle:@"Label03:" andFont:[UIFont fontWithName:HELVETICA_FONT_STYLE_BOLD size:12]];
    [contentView addSubview:typeLabel];

    UILabel *zonesLabel = [self createLabelWithTitle:@"Label04:" andFont:[UIFont fontWithName:HELVETICA_FONT_STYLE_BOLD size:12]];
    [contentView addSubview:zonesLabel];

    UILabel *sceneLabel = [self createLabelWithTitle:@"Label05:" andFont:[UIFont fontWithName:HELVETICA_FONT_STYLE_BOLD size:12]];
    [contentView addSubview:sceneLabel];

    UILabel *acresValueLabel = [self createLabelWithTitle:@"Data" andFont:[UIFont fontWithName:HELVETICA_FONT_STYLE size:12]];
    acresValueLabel.textAlignment = NSTextAlignmentLeft;
    [contentView addSubview:acresValueLabel];

    UILabel *addedValueLabel = [self createLabelWithTitle:@"Data" andFont:[UIFont fontWithName:HELVETICA_FONT_STYLE size:12]];
    addedValueLabel.textAlignment = NSTextAlignmentLeft;
    [contentView addSubview:addedValueLabel];

    UILabel *typeValueLabel = [self createLabelWithTitle:@"Name" andFont:[UIFont fontWithName:HELVETICA_FONT_STYLE size:12]];
    typeValueLabel.textAlignment = NSTextAlignmentLeft;
    [contentView addSubview:typeValueLabel];

    UILabel *zonesValueLabel = [self createLabelWithTitle:@"Data" andFont:[UIFont fontWithName:HELVETICA_FONT_STYLE size:12]];
    zonesValueLabel.textAlignment = NSTextAlignmentLeft;
    [contentView addSubview:zonesValueLabel];

    UILabel *sceneValueLabel = [self createLabelWithTitle:@"Name" andFont:[UIFont fontWithName:HELVETICA_FONT_STYLE size:12]];
    sceneValueLabel.textAlignment = NSTextAlignmentLeft;
    [contentView addSubview:sceneValueLabel];


    NSDictionary *views = NSDictionaryOfVariableBindings(headerView, imageView, acresLabel, acresValueLabel, addedLabel, addedValueLabel, typeLabel, typeValueLabel, zonesLabel, zonesValueLabel, sceneLabel, sceneValueLabel);

    [contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[headerView]-[acresLabel]"
                                                                        options:0
                                                                        metrics:nil
                                                                          views:views]] ;

    [contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[acresLabel]-[addedLabel(==acresLabel)]-[typeLabel(==acresLabel)]-[zonesLabel(==acresLabel)]-[sceneLabel(==acresLabel)]-|"
                                                                        options:NSLayoutFormatAlignAllRight
                                                                        metrics:0
                                                                          views:views]];

    [contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[acresValueLabel]-[addedValueLabel(==acresLabel)]-[typeValueLabel(==acresLabel)]-[zonesValueLabel(==acresLabel)]-[sceneValueLabel(==acresLabel)]-|"
                                                                        options:NSLayoutFormatAlignAllLeft
                                                                        metrics:nil
                                                                          views:views]];

    [contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[imageView]-20-[acresLabel]-[acresValueLabel]"  options:0  metrics:nil  views:views]];

    return contentView;
}

-(UIView *)createHeaderView {
    UIView *view = [UIView new];
    view.translatesAutoresizingMaskIntoConstraints = FALSE;
    view.backgroundColor = [UIColor blueColor];
    view.clipsToBounds = YES;

    [view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[view(30)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(view)]];

    UILabel *title = [UILabel new];
    title.translatesAutoresizingMaskIntoConstraints = FALSE;
    title.text = @"Default text";
    title.font = [UIFont fontWithName:HELVETICA_FONT_STYLE_BOLD size:14];
    title.textColor = [UIColor whiteColor];
    title.backgroundColor = [UIColor clearColor];
    self.headerLabel = title;

    [view addSubview:title];

    [view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[title]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(title)]];
    [view addConstraint:[NSLayoutConstraint constraintWithItem:title attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:view attribute:NSLayoutAttributeCenterY multiplier:1 constant:0]];

    self.headerGradient = [UIColor grayGradient];
    self.headerGradient.frame = CGRectMake(0, 0, 360, 30);

    [view.layer insertSublayer:self.headerGradient atIndex:0];

    return view;
}

-(UILabel *)createLabelWithTitle:(NSString *)title andFont:(UIFont *)font; {
    UILabel *label = [UILabel new];
    label.translatesAutoresizingMaskIntoConstraints = FALSE;
    label.text = title;
    label.font = font;
    label.textAlignment = NSTextAlignmentRight;
    label.textColor = [UIColor whiteColor];
    label.backgroundColor = [UIColor clearColor];

    return label;
}

ここに私のUICollectionViewCellファイルがあります.DatasetFilterListPanelViewだけaddSubviewです。

@implementation DatasetViewCell

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {

        [self addSubview:[[DatasetFilterListPanelView alloc] initWithFrame:CGRectMake(0, 0, 360, 160)]];
    }
    return self;
}

UIScrollview で同じパネルを使用すると、それらがすべて読み込まれて配置されると、スムーズにスクロールします。したがって、UICollectionView のオンデマンドでセルをロードする必要があります。

この UICollectionView チュートリアルに従いました

編集:セルの作成:

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
    DatasetViewCell *datasetCell = [collectionView dequeueReusableCellWithReuseIdentifier:DatasetCellIdentifier forIndexPath:indexPath];

    return datasetCell;
}

編集 2: インストルメント トレース:

ここに画像の説明を入力

ここに画像の説明を入力

ここに画像の説明を入力

4

2 に答える 2

4

わかりました、いろいろ遊んだ後、原因を突き止めました: 制約です! CodaFI は正しかった。パネルにはそれほど多くの制約がなかったので、それが問題になるとは思いませんでした。

nib ファイルを作成し、自動レイアウトを削除したところ、スムーズにスクロールできるようになりました。

今日の教訓: 制約は計算が遅い!

于 2013-03-01T22:50:03.303 に答える
1

一般的に問題は、セルを再利用しないことです。dequeueReusableCellWithReuseIdentifier:forIndexPath:既存のセルを再利用するために必ず使用してください。

于 2013-03-01T18:22:25.830 に答える