15

カスタムUIView内にUIButtonを配置しましたが、ボタンはタッチイベントを受け取りません(強調表示された状態にならないため、ハンドラー内でタッチを接続できないという問題ではありません)。私はそれをInterface BuilderのXIBに入れようとしましたが、プログラムでUIButtonをUIViewに別々に追加しようとしましたが、どちらもうまくいきませんでした。私のビューはすべてUIScrollView内にあるため、最初にUIScrollViewがそれらをブロックしている可能性があるため、カスタムビューをUIScrollViewに追加するのとまったく同じ方法でプログラムでボタンを追加し、ボタンが機能したため、UIScrollViewの可能性を排除できました原因となります。私のビューの階層は次のようになります。

ss

ボタンは画像ビューの上にあり、前面レイヤーがボタンを完全に占有していないため、ボタンを物理的に操作しない理由はありません。カスタム ビューのコード側では、ビューを次のように作成しています。

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
        UIView *sub = [[[NSBundle mainBundle] loadNibNamed:@"ProfileView" owner:self options:nil] objectAtIndex:0];
        [self addSubview:sub];
        [sub setUserInteractionEnabled:YES];
        [self setUserInteractionEnabled:YES];
        CALayer *layer = sub.layer;
        layer.masksToBounds = YES;
        layer.borderWidth = 5.0;
        layer.borderColor = [UIColor whiteColor].CGColor;
        layer.cornerRadius = 30.0;
        /*layer.shadowOffset = CGSizeZero;
        layer.shadowRadius = 20.0;
        layer.shadowColor = [[UIColor blackColor] CGColor];
        layer.shadowOpacity = 0.8;
        */
    }
    return self;
}

のすべての組み合わせを試しましsetUserInteractionsEnabledたが、うまくいきませんでした。(はい、Interface Builder でもチェックするように設定します)。また、「canBecomeFirstResponder」をオーバーライドして「YES」を返すようにする必要がある、同様の問題を伴う別の質問を読みました。また、それも行いました。しかし、問題は解決せず、ボタンをクリックできません。ボタンに特別なプロパティや設定を与えていません。これは単なる通常のものです。ビュー内の他のオブジェクト (下のラベル、ボタンの後ろの画像ビューなど) は問題なく正常に動作しています。ここで何が間違っている可能性がありますか?

ありがとう、

できる。

更新:ここに問題の簡単な再現があります: https://dl.dropbox.com/u/79632924/Test.zip 実行してボタンをクリックしてみてください。

4

4 に答える 4

18

テストプロジェクトを見ると、TestViewの作成方法に問題があると思います。フレームを指定していないため、基本的に親ビューは0サイズで、XIBから表示されるサブビューは親ビューから拡張されているため、レスポンダーチェーンで何も取得しません。

TestView を作成するときにフレームを指定するか、XIB ファイルを読み込んだ後にフレームを調整する必要があります。

于 2012-11-25T00:53:59.757 に答える
6

私もこの問題を抱えていました。私にとっての原因は、UIButtonスーパービュー フレームの高さが 0 だったため、タッチが発生していてもボタンに渡されていなかったと考えられます。

ボタンのスーパービューがフレームとしてより大きな長方形を取っていることを確認した後、ボタンのアクションが機能しました。

私の側でのこの問題の根本的な原因は、自動レイアウトの実装の誤りでした (ボタンのスーパービューの高さ制限を設定するのを忘れていました)。

于 2015-03-12T18:48:01.667 に答える
2

私は解決策を見つけました。カスタムビューを次のように初期化していました:

MyView *view = [[MyView alloc] init];

ビューのサイズのフレームで代わりに初期化し、イベントへの応答を開始しました。

CGRect rect = CGRectMake(0,0,width,height);
MyView *view = [[MyView alloc] initWithFrame:rect];
于 2012-11-25T00:52:15.837 に答える