1

これが私のビュー階層です。parentView(UIView)のサブビューにはUIImageViewがあり、サブビューにはUIButtonがあります。

left = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"left.png"]];
left.userInteractionEnabled = YES;
[parentView addSubview:left];

back = [UIButton buttonWithType:UIButtonTypeCustom];
[back setImage:[UIImage imageNamed:@"Arrow-left.png"] forState:UIControlStateNormal];
[back addTarget:self action:@selector(back:) forControlEvents:UIControlEventTouchUpInside];
back.showsTouchWhenHighlighted = YES;
[left addSubview:back];

すべてが正しく表示されますが、ボタンはタッチに反応しません。フレームをUIImageViewのフレームから別の場所に移動し、それをsubViewとしてparentView(UIView)に設定すると、応答します。しかし、ここにあります。

parentViewのsubViewに設定しても、UIImageViewのフレーム領域内にある場合はボタンが応答しません。userInteractionEnabledプロパティは、画像ビューに対してすでにYESに設定されています。何が起こっているのか分かりますか?

4

5 に答える 5

1

UIImageViewはuserInteractionをオフにします-オンにするとボタンが機能します。

編集:

だから私はあなたのコードを書かれた通りにほぼ正確に使用しました-1つの赤いニシンはあなたがそれがすべてうまく見えると言ったことです。私の場合、カスタムボタンのフレームは0,0,0,0だったので、何も表示されませんでした。フレームを設定すると、すべてが完全に機能しました。

    UIButton *back = [UIButton buttonWithType:UIButtonTypeCustom];
    UIImage *image = [UIImage imageNamed:@"46-truck.png"];
    assert(image);

    [back setImage:image forState:UIControlStateNormal];
    [back addTarget:self action:@selector(buttonAction:) forControlEvents:UIControlEventTouchUpInside];
    back.showsTouchWhenHighlighted = YES;
    back.frame = (CGRect){ {0,0}, image.size};

NSLog(@"FRAME: %@", NSStringFromCGRect(back.frame) );
    [imageView addSubview:back];

したがって、実行時にスーパービューを調べて何が何であるかを把握する必要がある場合は、以下のコードを使用できます。[UIView dumpSuperviews:back msg:@ "Darn Bark Button"];

@interface UIView (Utilities_Private)

+ (void)appendView:(UIView *)v toStr:(NSMutableString *)str;

@end

@implementation UIView (Utilities_Private)

+ (void)appendView:(UIView *)a toStr:(NSMutableString *)str
{
    [str appendFormat:@"  %@: frame=%@ bounds=%@ layerFrame=%@ tag=%d userInteraction=%d alpha=%f hidden=%d\n", 
        NSStringFromClass([a class]),
        NSStringFromCGRect(a.frame),
        NSStringFromCGRect(a.bounds),
        NSStringFromCGRect(a.layer.frame),
        a.tag, 
        a.userInteractionEnabled,
        a.alpha,
        a.isHidden
        ];
}

@end

@implementation UIView (Utilities)

+ (void)dumpSuperviews:(UIView *)v msg:(NSString *)msg
{
    NSMutableString *str = [NSMutableString stringWithCapacity:256];

    while(v) {
        [self appendView:v toStr:str];
        v = v.superview;
    }
    [str appendString:@"\n"];

    NSLog(@"%@:\n%@", msg, str);
}

+ (void)dumpSubviews:(UIView *)v msg:(NSString *)msg
{
    NSMutableString *str = [NSMutableString stringWithCapacity:256];

    if(v) [self appendView:v toStr:str];
    for(UIView *a in v.subviews) {
        [self appendView:a toStr:str];
    }
    [str appendString:@"\n"];

    NSLog(@"%@:\n%@", msg, str);
}

@end
于 2012-07-25T14:29:34.230 に答える
0

私は以前にこれが起こったことがあります..それはイベントを飲み込んだスーパービューだったと思います。

それをparentViewに追加すると、画像ビューと重ならない場合にのみ機能するとおっしゃっていました。画像ビューでユーザーインタラクションを無効にした場合、ボタンイベントはparentViewに追加されたときに一貫してトリガーされますか?

于 2012-07-25T15:05:47.330 に答える
0

多分

parentView.userInteractionEnabled = YES;

または、親ビューフレームが小さすぎて、ボタンまたは画像ビューを保持できません。親ビューのサイズを確認してください。

于 2012-07-25T15:05:10.677 に答える
0

実際にはuserInteractionEnabled = NO、タッチが通過できるように設定する必要があります。

ここから撮影。

于 2012-07-25T15:36:33.387 に答える
-1
left.userInteractionEnabled = YES;

この行を最後に置きます。

于 2012-07-25T14:50:23.313 に答える