私は賢いと思い、正確なフレームサイズでUIImageViewの上に透明なUIButtonを配置するだけで、TouchUpInsideなどの好きなイベントに簡単に接続して、ビューコントローラーのアクションメソッドを呼び出せるようになりました。ユーザーがそれに触れます。まあ、それはアルファが0.1fを下回るまで機能します。 0.01fを実行すると、機能しません。したがって、それを機能させるために、画面を長時間見ると、0.1fのアルファが透けて見えることがわかります。そして、それは完全に嫌です;)
IPhone OSは巧妙にしようとしていて、視覚的にボタンがない場合はボタンのイベントをキャッチしないようです。それを解決する方法はありますか?
確かに、UIImageViewのサブクラスを作成し、touchesBegan:...などを実装することはできますが、それほどエレガントではありません。つまり...ウェブ上で画像をハイパーリンクしたい場合、その画像用に独自のHTML要素を作成することは絶対に避け、クリックしたときにURLに接続するだけです。それは私にはあまり意味がありません。
Interface Builderでボタンの「タイプ」を「カスタム」に設定できるはずです。UIImageView上にテキストやグラフィック要素は表示されません。このように、アルファを調整する必要はありません。ビューがコードから構築されている場合は、次を使用します。
button = [UIButton buttonWithType:UIButtonTypeCustom];
これを行う最良の方法は次のとおりです。
myButton.hidden = YES;
ButtonTypeプロパティは読み取り専用プロパティであるため、使用できません。これを使用する唯一の方法は、ボタンを動的に作成する場合です。
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];
ボタン(または任意のオブジェクト)を非表示にして、そのレイヤーにマスクを追加することにより、ボタンをアクティブに保つことができます。ボタンは非表示になりますが、イベントをキャッチします。
let layer = CAShapeLayer()
layer.frame = .zero
myButton.layer.mask = layer
また、ボタンに画像を割り当てることができると信じています。
画像はフレーム全体を占める可能性があり、正しく設定すればボタンの他のアーティファクトがなくなる可能性もあります。
プロパティをチェックしてください
UIButtonInstance.currentImage
そうすれば、本質的にすでに存在する要素でリソースを占有することはありません。
私は次のコードを使用してそれを行うことができました。 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;
}
}
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に設定して、クリックするとクリック効果が表示されるようにします。
これは私がしたことですが、UIButtonのサブクラスを使用すると、後でネットのようにサブクラス化されるべきではないことがわかりました。私のサブクラスはポイントと呼ばれていました
ポイント* mypoint = [ポイントbuttonWithType:UIButtonTypeCustom];
次に、ボタンに追加する画像がある場合:[mypoint setImage:imageNamed:@ "myimage"] forstate:UIControlStateNormal];
この画像を追加しない場合、ボタンはユーザーには表示されませんが、タッチに応答する必要があります。これが、ユーザーの操作に応答するためにimageViewにホットスポットを作成した方法です。
それが私が見つけた唯一の方法です...
[yourButton setImage:[UIImage imageNamed:@"AnEmptyButtonWithTheSameSize.png"] forState:UIControlStateNormal];
画像の世話をします。 .pngである必要があります
カスタム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;
}
上記のジェイソンズの答えはほぼ正しいですが、ボタンの種類を設定することはできません。したがって、プログラムで空のボタンを作成するには、次のコードを使用します。
UIButton* myButton = [UIButton buttonWithType:UIButtonTypeCustom];
myButton.frame=frame;
[self.view addSubview:myButton];