4

与えられた画像の形でUIButtonを作成するにはどうすればよいですか。

それに近いものを作成することはできますが、画像がボタンに収まらないようです。私の要件は以下の画像です。ie;semicircle

ボタンの作成に使用したコードを以下に示します。

このボタンを取得するには、次の画像にどのような変更を加える必要がありますか。ps-別のクラスで行われたサブビューを追加します。

btnStartGame  =[UIButton buttonWithType:UIButtonTypeCustom];
[btnStartGame setFrame:CGRectMake(60, 200, 200, 200)];

btnStartGame.titleLabel.font=[UIFont fontWithName:@"Helvetica-Bold" size:30];
[btnStartGame setImage:
[UIImage imageNamed:@"Draw button.png"]  forState:UIControlStateNormal];

btnStartGame.titleLabel.textColor=[UIColor redColor];
btnStartGame.clipsToBounds = YES;
btnStartGame.layer.cornerRadius = 50;//half of the width
btnStartGame.layer.borderColor=[UIColor redColor].CGColor;
btnStartGame.layer.borderWidth=2.0f;

btnStartGame.tag=20;
btnStartGame.highlighted=NO;
4

2 に答える 2

2

ダウンロード可能なソースコードを備えた本当に素晴らしいチュートリアルがここにあります:

http://iphonedevelopment.blogspot.co.uk/2010/03/irregularly-shape-uibuttons.html

基本的に、UIImageにカテゴリを作成する必要があります。このカテゴリは、タッチしたポイントが透明な画像であるかどうかをチェックします。これは、不規則な形状のヒットテストをチェックするために使用できることを意味します。

次に、UIButtonをサブクラス化し、hitTest:withEventをオーバーライドします。

お役に立てれば

于 2013-02-07T11:43:00.220 に答える
1

他の回答によってリンクされたJeffLamarcheによるソリューションは正常に機能しますが、大量のメモリを使用したり、多くの作業を実行したりします。

  • NSDataイニシャライザで一度作成すると、各ボタンの存続期間中、比較的大きなメモリブロックを保持することになります。
  • 回答で行われているように一時的にすると、ボタンを押すたびに画像全体が変換され、数千ピクセルが処理され、1バイトをフェッチした後に結果が破棄されます。

この回答で概説されているアプローチに従うことで、メモリ使用量とCPU消費量の両方の観点から、これをはるかに効率的に行うことができることがわかりました。

サブクラス、およびそのメソッドを次のようUIButtonにオーバーライドします。pointInside:withEvent:

-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
    if (![super pointInside:point withEvent:event]) {
        return NO;
    }
    unsigned char pixel[1] = { 0 };
    CGContextRef context = CGBitmapContextCreate(pixel, 1, 1, 8, 1, NULL, (CGBitmapInfo)kCGImageAlphaOnly);
    UIGraphicsPushContext(context);
    UIImage *image = [self backgroundImageForState:UIControlStateNormal] ;
    [image drawAtPoint:CGPointMake(-point.x, -point.y)];
    UIGraphicsPopContext();
    CGContextRelease(context);
    return pixel[0] != 0;
}

上記のコードは、ボタンの背景画像からアルファを取得します。ボタンが別の画像を使用している場合は、image上の変数を初期化する行を変更してください。

于 2015-04-04T10:56:31.127 に答える