web-dev-qa-db-ja.com

まだ「そこに」あり、UIImageViewのタッチイベントをキャッチする非表示のUIButtonを作成する方法はありますか?

私は賢いと思い、正確なフレームサイズでUIImageViewの上に透明なUIButtonを配置するだけで、TouchUpInsideなどの好きなイベントに簡単に接続して、ビューコントローラーのアクションメソッドを呼び出せるようになりました。ユーザーがそれに触れます。まあ、それはアルファが0.1fを下回るまで機能します。 0.01fを実行すると、機能しません。したがって、それを機能させるために、画面を長時間見ると、0.1fのアルファが透けて見えることがわかります。そして、それは完全に嫌です;)

IPhone OSは巧妙にしようとしていて、視覚的にボタンがない場合はボタンのイベントをキャッチしないようです。それを解決する方法はありますか?

確かに、UIImageViewのサブクラスを作成し、touchesBegan:...などを実装することはできますが、それほどエレガントではありません。つまり...ウェブ上で画像をハイパーリンクしたい場合、その画像用に独自のHTML要素を作成することは絶対に避け、クリックしたときにURLに接続するだけです。それは私にはあまり意味がありません。

27
Thanks

Interface Builderでボタンの「タイプ」を「カスタム」に設定できるはずです。UIImageView上にテキストやグラフィック要素は表示されません。このように、アルファを調整する必要はありません。ビューがコードから構築されている場合は、次を使用します。

button = [UIButton buttonWithType:UIButtonTypeCustom];
44
Jason

これを行う最良の方法は次のとおりです。

myButton.hidden = YES;

ButtonTypeプロパティは読み取り専用プロパティであるため、使用できません。これを使用する唯一の方法は、ボタンを動的に作成する場合です。

3
MrShoot

UIButtonTypeCustomに加えて、ボタンのテキストの色を次のように設定しました。

[button setTitleColor:[UIColor clearColor] forState:UIControlStateNormal];
[button setTitleShadowColor:[UIColor clearColor] forState:UIControlStateNormal];
[button setTitleColor:[UIColor clearColor] forState:UIControlStateHighlighted];
[button setTitleShadowColor:[UIColor clearColor] forState:UIControlStateHighlighted];
3
David Green

ボタン(または任意のオブジェクト)を非表示にして、そのレイヤーにマスクを追加することにより、ボタンをアクティブに保つことができます。ボタンは非表示になりますが、イベントをキャッチします。

let layer = CAShapeLayer()
layer.frame = .zero
myButton.layer.mask = layer
1
Arnaud

また、ボタンに画像を割り当てることができると信じています。

画像はフレーム全体を占める可能性があり、正しく設定すればボタンの他​​のアーティファクトがなくなる可能性もあります。

プロパティをチェックしてください

UIButtonInstance.currentImage

そうすれば、本質的にすでに存在する要素でリソースを占有することはありません。

1
Bluephlame

私は次のコードを使用してそれを行うことができました。 iPadが横向きの場合、ボタンは画面の右上に配置されます。

    UIButton *adminButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    adminButton.frame = CGRectMake(974.0f, 0.0f, 50.0f, 50.0f);
    [adminButton setBackgroundColor:[UIColor clearColor]];
    [adminButton setTag:1];
    [adminButton addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];

    [self.view addSubview:adminButton];

'adminButton'を押すと、次の関数が実行されます。

- (void)buttonPressed:(id)sender  {

int buttonId = ((UIButton *)sender).tag;

  switch(buttonId) {
    case 1:
       NSLog (@"Admin button was pressed");
        break;
    case 2:
        //if there was a button with Tag 2 this will be called
        break;

    default:
        NSLog(@"Key pressed: %i", buttonId);
        break;
   }

}
0
r farnell

lazyImageView = [[UIImageView alloc] init];

                        button=[[UIButton alloc]init];
                        [UIButton buttonWithType:UIButtonTypeRoundedRect];
                        [button addTarget:self
                                   action:@selector(aMethodForVideo:)
                         forControlEvents:UIControlEventTouchUpInside];
                        [button setBackgroundImage:[UIImage    imageNamed:@"BackTransparent.png"] forState:UIControlStateHighlighted];
                        [button setTitle:@"" forState:UIControlStateNormal];

                                lazyImageView.frame=CGRectMake(x, y, w, h);
                                button.frame=CGRectMake(x, y, w, h);

ボタンのフレームを設定し、画像は両方とも同じフレームを持っています。私はこのコードを使用して正常に動作しています。また、ボタンの背景画像をState:UIControlStateHighlightedに設定して、クリックするとクリック効果が表示されるようにします。

0
chetu

これは私がしたことですが、UIButtonのサブクラスを使用すると、後でネットのようにサブクラス化されるべきではないことがわかりました。私のサブクラスはポイントと呼ばれていました

ポイント* mypoint = [ポイントbuttonWithType:UIButtonTypeCustom];

次に、ボタンに追加する画像がある場合:[mypoint setImage:imageNamed:@ "myimage"] forstate:UIControlStateNormal];

この画像を追加しない場合、ボタンはユーザーには表示されませんが、タッチに応答する必要があります。これが、ユーザーの操作に応答するためにimageViewにホットスポットを作成した方法です。

0
j2emanue

それが私が見つけた唯一の方法です...

[yourButton setImage:[UIImage imageNamed:@"AnEmptyButtonWithTheSameSize.png"] forState:UIControlStateNormal];

画像の世話をします。 .pngである必要があります

0
user1581885

カスタムUIButtonは、アルファが0に設定されていない限り、ユーザーの操作に応答します。カスタムUIButtonをimageViewの上に配置し、buttonPressedアクションに接続します。また、UIViewに追加の強調表示された画像を設定しました。これで、実際にはUIButtonのように動作します。最初に、UIViewが強調表示されたままになる期間を定義しました。

#define HIGHLIGHTED_DURATION 0.1 

次に、ボタンが押された場合に画像ビューを強調表示するように設定し、タイマーを開始して、その間強調表示されたままにします。 imageviewに強調表示された画像を設定することを忘れないでください。

- (IBAction)buttonPressed:(id)sender {

[_yourImageView setHighlighted:YES];
_timer = [NSTimer scheduledTimerWithTimeInterval:HIGHLIGHTED_DURATION
                                          target:self
                                        selector:@selector(removeHighlighted)
                                        userInfo:nil
                                         repeats:NO];
}

そして、タイマーが終了したら、ハイライトを元に戻すだけです。

-(void) removeHighlighted{
    _yourImageView.highlighted = NO;

}
0

上記のジェイソンズの答えはほぼ正しいですが、ボタンの種類を設定することはできません。したがって、プログラムで空のボタンを作成するには、次のコードを使用します。

UIButton* myButton = [UIButton buttonWithType:UIButtonTypeCustom];
myButton.frame=frame;
[self.view addSubview:myButton];
0
LordT