【问题标题】:UIScrollView is not behaving smoothly after adding customized buttons添加自定义按钮后,UIScrollView 行为不流畅
【发布时间】:2013-04-03 03:49:48
【问题描述】:

我有一个 UIScrollView,其中有 500 多个自定义按钮,根据用户的要求,它可以多达一千个。实际上,UIButton 的子类。我使用 UIButton 类的原因是我必须在点击时执行一些操作。该对象如下图所示

这些按钮的排列就像 m*n 矩阵,其中行 (m) 固定为 20,但列 (n) 不固定。可以有 500 列。

我的问题是添加按钮后,scrollView 的行为不流畅。我使用以下代码创建每个对象

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
        sizeLabel = [[UILabel alloc] initWithFrame:sizeLabelRect];
        sizeLabel.font = [UIFont boldSystemFontOfSize:sizeLabelFontSize];
        sizeLabel.textAlignment = UITextAlignmentCenter;
//        sizeLabel.backgroundColor = [self colorWithHexString:LABEL_BG_COLOR];
//        sizeLabel.layer.cornerRadius = CORNER_RADIUS;
        [self addSubview:sizeLabel];

        nFilesLabel = [[UILabel alloc] initWithFrame:nFilesLabelRect];
        nFilesLabel.font = [UIFont boldSystemFontOfSize:nFilesFontSize];
        nFilesLabel.textAlignment = UITextAlignmentCenter;
//        nFilesLabel.backgroundColor = [self colorWithHexString:LABEL_BG_COLOR];
//        nFilesLabel.layer.cornerRadius = CORNER_RADIUS;
        [self addSubview:nFilesLabel];

        maxDisimilarity = [[UILabel alloc] initWithFrame:disimilarityRect];
//        maxDisimilarity.layer.cornerRadius = CORNER_RADIUS;
        [self addSubview:maxDisimilarity];

//        nFragment = [[UILabel alloc] init];
//        nFragment.font = [UIFont systemFontOfSize:nFragmentFontSize];
//        [self addSubview:nFragment];
    }
    return self;
}

/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect
{
    // Drawing code
}
*/

- (void)setObj:(CloneClass *)obj
{
    NSString *colorCode;
    if (obj != nil) {
        _obj = obj;
        if ([_obj.type isEqualToString:@"1"]) {
            colorCode = COLOR;
        } else if ([_obj.type isEqualToString:@"2"]) {
            colorCode = COLOR;
        } else if ([_obj.obj isEqualToString:@"Type-3"]) {
            colorCode = COLOR;
        }
        self.backgroundColor = [self colorWithHexString:colorCode];
        [self setTitle:[NSString stringWithFormat:@"%d", obj.nFragments] forState:UIControlStateNormal];

        // set size of clone class
        if (_obj.size > LARGE_SIZE) {
            sizeLabel.text = LARGE_SIZE_TEXT;
        } else if (_obj.size > MEDIUM_SIZE && _obj.size <= LARGE_SIZE) {
            sizeLabel.text = MEDIUM_SIZE_TEXT;
        } else {
            sizeLabel.text = SMALL_SIZE_TEXT;
        }

        // set number of files within a clone class
        nFilesLabel.text = [NSString stringWithFormat:@"%d", _cloneClass.nFiles];

        // set color for disimilarity
        CGFloat similarity = 1.0 - _cloneClass.maxDisimilarity;
        maxDisimilarity.backgroundColor = [UIColor colorWithRed:1.0 green:similarity blue:similarity alpha:1.0];

    } else {
        self.backgroundColor = [UIColor grayColor];
        [self setTitle:@"/" forState:UIControlStateNormal];
    }

    self.titleLabel.textColor = [UIColor blackColor];
}

滚动视图甚至不适用于 10*10 矩阵。

提前致谢

【问题讨论】:

  • 因为你添加了大量的自定义元素,是我的猜测。你的滚动视图有多大?你可以修改你的表格以垂直而不是水平工作并使用表格视图来代替吗?
  • 如果我可以修改我的垂直工作,我可以使用 UITableView 来解决这个问题。不幸的是,我必须水平控制它。
  • 你在实施 ARC 吗?

标签: ios ipad uiscrollview uibutton


【解决方案1】:

我会调查UICollectionView。你现在会遇到内存问题。 UICollectionView 允许您创建类似于UITableViewCells 的UICollectionViewCell 可以重复使用。

请参阅Apple Documentation

【讨论】:

  • 请记住,UICollectionView 直到 iOS 6.0 才添加到 SDK 中,以防您需要支持早期版本的操作系统。
  • 确实如此。我倾向于积极推动我的操作系统版本,我忘记了不是每个人都这么幸运。 :)
  • PSTCollectionView 是 UICollectionView 的一个很好的替代品。它在早期版本中的工作方式相同,并在可用时将其替换为 UICollectionView。
  • 如果我尝试使用 UICollectionView,我将不得不更改很多东西。不管怎么说,还是要谢谢你。还有什么我可以尝试的吗?
  • 没有UICollectionView 就没有简单的解决办法。您要实例化的对象的数量将意味着处理您自己的可见对象缓存,当它们不可见时释放它们自己并在它们变得可见之前分配它们自己。这基本上复制了 UICollectionView 已经完成的功能。
猜你喜欢
  • 2018-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-21
  • 1970-01-01
  • 2017-11-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多