2

(400+) を に追加UIButtonUIScrollviewsimulatorいます。スクロールするとうまく機能しますが、iPad ではスクロールが遅くなります。

これが私がやっていることです。

- (void)viewDidLoad {
[scrollView setContentSize:CGSizeMake(180 * 24 , 22 * 40 + 200)];
for (int e=0; e<12; e++) {
    for(int i=0;i<24;i++)
    {
        UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
        btn.titleLabel.font = [UIFont systemFontOfSize:12.0f];
        [btn setBackgroundColor:[UIColor colorWithRed:248.0/255.0 green:248.0/255.0 blue:248.0/255.0 alpha:1]];


        CALayer *layer = btn.layer;
        layer.cornerRadius = 5.f;
        layer.masksToBounds = YES;
        layer.borderWidth = 1.f;
        layer.borderColor = [[UIColor colorWithRed:190.0/255.0 green:190.0/255.0 blue:190.0/255.0 alpha:1] CGColor];

        CGRect rect = btn.frame;
        rect.size.height = 40;
        rect.size.width = 50;
        rect.origin.x =  100 * i;
        rect.origin.y = 40 * e;
        btn.frame = rect;

        CAGradientLayer *shineLayer = [CAGradientLayer layer];
        shineLayer.frame = layer.bounds;
        shineLayer.colors = [NSArray arrayWithObjects:
                             (id)[UIColor colorWithWhite:0.9f alpha:0.5f].CGColor,
                             (id)[UIColor colorWithWhite:0.9f alpha:0.7f].CGColor,
                             (id)[UIColor colorWithWhite:0.9f alpha:1.f].CGColor,
                             (id)[UIColor colorWithWhite:0.9f alpha:1.f].CGColor,
                             (id)[UIColor colorWithWhite:0.9f alpha:1.f].CGColor,nil];
        [layer addSublayer:shineLayer];

        UILabel *lblDes = [[UILabel alloc] initWithFrame:CGRectMake(0,0,50,40)];
        lblDes.backgroundColor = [UIColor clearColor];
        lblDes.numberOfLines = 3;
        lblDes.textColor = [UIColor colorWithRed:4.0/255.0 green:106.0/255.0 blue:200.0/255.0 alpha:1];
        lblDes.textAlignment = UITextAlignmentCenter;
        lblDes.text = @"adf";
        lblDes.tag = -1;
        lblDes.font = [UIFont systemFontOfSize:11.f];

        [btn addSubview:lblDes];
        [scrollView addSubview:btn];
    }
}
[super viewDidLoad];  // Do any additional setup after loading the view, typically from a nib. }
4

2 に答える 2

1

iOS シミュレーターは Mac 上で実行され、実際のデバイスよりもはるかに高速です。

それはすべてあなたの要件に依存します(なぜそんなに多くのボタンが必要なのか)、

UIView をサブビューとして追加し、次に drawRect で必要なものを描画することをお勧めします。次に、ジェスチャー認識機能を使用して、ユーザーがタップした場所を見つけることができます。(tdubikから提案されたとおり)

他の解決策はtableViewです。(セルを再利用する可能性があります。各セルにボタンを追加できます)。

tableView が探しているものではなく、drawRect が単純すぎる場合 (選択効果がないため) - 非表示の UIButton を 1 つ持つことができ、(強調表示された状態で) ユーザーがタップした場所に対応して配置され、削除されます。ユーザーが画面からタッチを削除したとき。

編集

drawrect を使用する場合 - drawrect を使用して要素が描画されるサブビューのジェスチャ認識機能を追加できます。

CustomViewClass *mView = [CustomViewClass alloc] init];

...

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc]
    initWithTarget:self action:@selector(handleTap:)];

singleTap.delegate = self;

singleTap.numberOfTapsRequired = 1;

singleTap.numberOfTouchesRequired = 1;

[mView addGestureRecognizer:singleTap];

その後 :

- (void)handleTap:(UITapGestureRecognizer *)tap
{
    CGPoint mPoint = [tap locationInView:tap.view];

    int mOffset = 0; //beginning offset where buttons will start.

    for(int i = 0; i < 20; i++) //how many rows of buttons? 20? 
    { 
        mOffset += 20; //your custom drawn button height + offset from previous button

        if(mPoint.y < mOffset) //now check - if y tapped position is lower than current button.y + its height, then we know what button we tapped.
        {
            //do something - we found button row!!
            break;
        }
    }

    mOffset = 0; //beginning x offset

    for(int i = 0; i < 20; i++) //how many columns buttons? 20? 
    { 
        mOffset += 20; //your custom drawn button width + offset from previous button

        if(mPoint.x < mOffset) //now check - if x tapped position is lower than current button.x + its width, then we know what button we tapped.
        {
            //do something - we found button column!! at this point we know which button was tapped.
            break;
        }
    }
}

2 次元のボタン配列がある場合は、x 座標に対して同じチェックを追加します。

于 2012-10-16T09:24:01.093 に答える
0

ボタンが遅い原因であることを確認するために、Instruments でアプリケーションをプロファイリングします。

UIButtons の代わりに、ジェスチャー認識機能がインストールされた UIView 派生クラスまたは UIControl のみを作成します。最良のアプローチは、 drawRect メソッドを使用してビューを描画することです。

于 2012-10-16T09:19:33.987 に答える