2

IB を使用して、いくつかのボタンを含む小さなサブビューを作成しました。私のコントローラーは、xib ファイルから小さなビューを読み取り、それをサブビューとしてメイン ビューに追加します。サブビューとそのすべてのボタンが表示されます。私が見る限り、コントローラーの IBOutlets と IBActions にも接続します。

しかし、ボタンを押しても何も起こりません!実際、ボタンを押すと、スーパー ビューの touchesBegan が呼び出されます。 スーパービューには「通常のボタン」(つまり、サブビューの兄弟) も含まれており、そのボタンは正常に機能します! 問題: サブビューのボタンが機能しないのはなぜですか?

-(void) loadMultibutt{
    self.buttErase = nil; // test if the outlet connects
    NSArray *arr = [[NSBundle mainBundle]
                    loadNibNamed:@"multibutt_ipad" owner:self options:nil];

    UIView *viewButts = [arr objectAtIndex:0];
    ViewWorkbench* vw = (ViewWorkbench*) self.view;
    [vw addMultibuttView:viewButts];

    // now, buttErase != nil.
    NSSet *setTest = [self.buttErase allTargets];
    NSLog(@"setTest = %@", setTest); // This works!
}
4

1 に答える 1

7

あなたの返信に基づいて、ボタンの親ビューのインタラクティブ領域にボタンが含まれていないことが問題であると結論付けて安心です。サブビューをクリッピングしていないため、引き続き表示できますが、それらを操作することはできません。問題を解決するには2つのオプションがあります

a) (推奨) ボタンを適切な場所に配置して、親ビューの表示 (およびインタラクティブ領域) 内に収まるようにします。

b) 親ビューの hitTest セレクターをオーバーライドして、サブビュー内のすべてのタッチ (境界外のものを含む) を追跡するようにします。そのためには、UIView のサブクラスを作成し、以下を実装する必要があります。

-(UIView *) hitTest:(CGPoint)point withEvent:(UIEvent *)event{
UIView* result = [super hitTest:point withEvent:event];
if (result)
    return result;
for (UIView* sub in [self.subviews reverseObjectEnumerator]) {
    CGPoint pt = [self convertPoint:point toView:sub];
    result = [sub hitTest:pt withEvent:event];
    if (result)
        return result;
}
return nil;

}

于 2013-04-22T08:42:27.337 に答える