2009-10-13 3 views
5

どのように非長方形のボタンを得ることができますか?長方形以外のiPhoneボタン?

たとえば、アルファ透明度を持つPNG画像があります。 ボタンの形状を透明な色のないこの画像に設定するにはどうすればよいですか?

+0

詳細をあなたが達成したいと思っているのは、あなたがより速く行きたいところにあなたを得るかもしれません。 – fbrereto

答えて

8

を使用すると、タッチイベントを登録するための合理的な面を持っていなければならないと言うが、私はちょうど私がそれをやったかを教えてくれますので、あなたがそれを知っているし、あなたの理由を持っていると確信している:

私が必要それほどずっと前にこれをやってください。そして、私がしたことは、Sixten Ottoがちょうど提案したものです。いくつかのヒントがある時点で、あなたの画像のアルファ値を取得するための私の元の質問(「UPDATE」セクション)にあります。

How to create a transparent window with non-rectangular buttons?

編集:私は、以下の例ではなく、場合のUicontrolをサブクラス化提案しますボタンの特別な振る舞いは必要ありません。「非直角」から離れて、PNGで設定されたボーダレスなUIButtonをサブクラス化するだけで、仕事が少なくて済みます。あなたはUIControlをサブクラス化し、それを「困難な方法」でやって、コントロールの振る舞いをより詳細に制御できます。

UIControlをサブクラス化し、タッチイベントメソッドをオーバーライドし、タップポイントの下のアルファをチェックして、alpha == 0の場合はイベントを処理しないことをお勧めします。描画する場合は、drawRect:をオーバーライドし、そこにNSImageのメソッドを使用して、コントロールのフレームに画像を描画します。

buttonImage = [NSImage imageNamed:@"myButtonImage"]; 
buttonImageRep = [[buttonImage representations] objectAtIndex:0]; 

は、その後、あなたがコントロールのビューにそれを描くことができます::(stateImageは応じて描画されなければならない画像へのポインタである

まずあなたがイメージをロードし、それのビットマップ表現を取得する必要がありますボタンが押されている場合はオン)

- (void)drawRect:(NSRect)aRect { 
[stateImage drawInRect:[self bounds] fromRect:NSMakeRect(0.0,0.0,[buttonImage size].width,[buttonImage size].height) 
     operation:NSCompositeSourceOver fraction:1.0]; 
} 

この時点で、あなたのボタンはあなたのpng画像で描かれています。アルファが0でない場合は、タッチイベントメソッドをオーバーライドしてイベントを処理できます。

NSColor *colorUnderMouse = [buttonImageRep colorAtX:mouse.x y:mouse.y]; 
float alpha = [colorUnderMouse alphaComponent]; 

これは私がやったことです。素晴らしく機能します。お役に立てれば!

N.B:私の例はMac用ですが、iPhoneでも動作するはずです。

5

長方形のボタンをHERESに...カスタムボタンタイプを使用して、ボタンの長方形のエッジを取り除くために画像を割り当てることができ、

7

http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIButton_Class/UIButton/UIButton.html#//apple_ref/doc/c_ref/UIButtonTypeボタンの種類に及びUIButton http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIButton_Class/UIButton/UIButton.htmlへの参照ボタンタイプですボタンのクリック可能な領域を、使用しているPNGと正確に一致させるように見ているようです。

これがあなたが探しているものなら、私はまずそれをしないと言っています。 iPhoneは指を使って押されていますが、一般にそのような小さな領域を区別する精度はありません。

しかし、アイデアに悩まされている場合は、ボタンを使用しないで親フレームのクリックを処理し、手動でクリックのX/Y値を解釈して、 (丸いエッジボタンの場合、4つの円と2つの長方形をチェックした結果である可能性が高い)

編集: オリジナルの質問の一部を実現すると、アルファチャンネルに基づいて自動的に機能します。境界領域に関する私の方法をお勧めしますが、ボタンの原点からオフセットされた値でAlphaチャンネルをテストするためにPNGをサンプリングすることで、これを理論的に達成できます。通常のボタンのクリックイベントでこれを行う可能性もあります。

2

Guvante saysと同じように、精度の高いタッチに頼るのは本当に良い考えではありません。 Appleは、例えば、controls be at least 44px acrossを推奨しています。

UIButtonTypeCustomUIButtonを使用し、ボタンの画像をPNGに設定し、タッチイベント(see here for more on event handling)に登録することをおすすめします。次に、あなたのアクションメソッドでは、タッチの座標をイベントから取得し、それらの座標を画像のアルファに対してテストして、実際のタッチとして扱うかどうかを調べることができます。他の人のように

1

ボタンを複数の長方形の部分に分割することもできます。

1

@Form Right 'drawRect'を使用してボタンのカスタムシェイプを実装する方法について説明します。内側のボタン内部のかを試験touchに

しかし、より良いmethodは、あなたはいくつかの部分でタッチ用の透明あなたのボタンを作成することができ

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event; 

を使用しています。

あなたがイメージにサブビューの階層構造を描画するために新しいmethodを使用することができます(たとえば、あなたがボタンのテキストを描画している場合)、ボタンのカスタムイメージを使用できない場合:まさにそれに

- (BOOL)drawViewHierarchyInRect:(CGRect)rect afterScreenUpdates:(BOOL)afterUpdates; 
関連する問題