Programing

UIView — "사용자 상호 작용이 활성화 됨"부모에서는 false이지만 자식에서는 true입니까?

lottogame 2020. 12. 26. 09:26
반응형

UIView — "사용자 상호 작용이 활성화 됨"부모에서는 false이지만 자식에서는 true입니까?


상위 뷰에서 userInteractionEnabled = NO로 표시되면 모든 하위 뷰에서 사용자 상호 작용이 방지됩니다. 이 올바른지? 이 문제를 해결할 방법이 있습니까?


맞습니다. 상위 뷰에서 NO로 설정된 userInteractionEnabled는 모든 하위 뷰로 계단식으로 내려갑니다. 상호 작용을 활성화하기 위해 일부 하위보기가 필요하지만 다른보기는 필요하지 않은 경우 하위보기를 두 개의 상위보기로 분리 할 수 ​​있습니다. 하나는 userInteractionEnabled = YES이고 다른 하나는 NO입니다. 그런 다음 두 개의 상위 뷰를 기본 뷰에 배치합니다.


UIView를 하위 클래스로 만들고 hitTest : withEvent :를 재정 의하여 지정한 뷰 (_backView)에 터치 이벤트를 전달할 수 있습니다.

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    UIView *view = [super hitTest:point withEvent:event];

    if (view == self) {
        view = _backView;
    }

    return view;
}

터치 이벤트가이 뷰에 의해 처리되는 경우 "_backView"(인터페이스 빌더를 사용하여 설정할 수 있도록 IBOutlet 일 수 있음)로 전달됩니다. 그리고 자식 뷰에 의해 처리되는 경우 해당 자식을 반환합니다 ( [super hitTest:point withEvent:event]; 의 결과 )

이 솔루션은 이벤트를 전달해야하는 뷰를 알고있는 한 괜찮습니다. 게다가 현재 UIView의 하위보기가 아닌보기 (_backView)를 반환하고 있기 때문에 문제가 있는지 알 수 없습니다 !! 하지만 제 경우에는 잘 작동했습니다.

더 나은 해결책은 UIView 배경 에서 터치 비활성화에 언급 된 것일 수 있으므로 하단 뷰의 버튼을 클릭 할 수 있습니다 -pointInside:withEvent:. 이전 솔루션에 비해 이벤트를 수신하기 위해 '_backView'를 지정할 필요가 없다는 점에서 더 좋습니다 (이벤트는 단순히 체인의 다음보기로 전달됨)! 단점은 -pointInside:withEvent:모든 하위 뷰 에서 수행해야한다는 점입니다 (하지만 오버 헤드는 무시할 수 있음).


나는 방금 이상한 상황에 부딪혔다. 하위 뷰로 UIButton이있는 UIView (이것을 V라고 부름)가 있습니다. 이 UIButton, 버튼 X를 호출합니다. 아래는 버튼 X의 대상 / 선택기에 사용하는 방법입니다. 아래는 뷰 V입니다. 보낸 사람 매개 변수는 버튼 X입니다.

문제를 일으키는 상황은 UI의 다른 버튼 (탐색 모음에서이 버튼을 Y라고 부름)을 터치 한 다음 버튼 X를 매우 빠르게 터치하면 버튼 Y 동작이 뷰 V를 비활성화하는 경우입니다. 터치 이벤트가 버튼 X로 전송되었습니다.

- (void) buttonAction: (UIButton *) sender
{
    NSLog(@"superview: %d", sender.superview.userInteractionEnabled);  
    NSLog(@"button itself: %d", sender.userInteractionEnabled);

    // <snip>
}

출력은 다음과 같습니다.

2014-12-19 16 : 57 : 53.826 MyApp [6161 : 960615] superview : 0
2014-12-19 16 : 57 : 53.826 MyApp [6161 : 960615] 버튼 자체 : 1

즉, 버튼 액션이 발생했고 버튼의 수퍼 뷰에서 사용자 상호 작용이 비활성화되었습니다! 그리고 하위보기에는 여전히 사용자 상호 작용이 활성화되어 있습니다!

이것이 인위적이라고 생각하는 사람들에게는 내 앱의 UI에서 iPad (iOS 8.1.2 실행)에서 실행 중일 때 실수로 앱을 사용하는 동안 발생했습니다. 원래 생성 하려는 것이 아니 었습니다 .

생각?

내 현재 해결 방법이 아래에 나와 있지만 이것이 필요하다는 것이 정말 이상해 보입니다!

- (void) buttonAction: (id) sender
{
    NSLog(@"superview: %d", sender.superview.userInteractionEnabled);  
    NSLog(@"button itself: %d", sender.userInteractionEnabled);
    if (! self.userInteractionEnabled) return;

    // <snip>
}

내 "사용자 지정 경고 컨트롤러"보기 인 xib에서이 작업을 수행하고 있습니다.

for (UIView *subview in self.superview.subviews) {

    if (![subview isEqual:self]) {
        subview.userInteractionEnabled = NO;
    }
}

나는 이것에 대한 이상한 해결책을 만들었고, tableView 셀에 내가 만질 수 있기를 원했지만 부모가 가져서는 안되는 자식 뷰가있었습니다 ...

위의 솔루션 중 어느 것도 저에게 효과가 없었지만 다른 솔루션을 찾았습니다. 스토리 보드로 이동하여 부모보기에 tapGestureRecognizer를 추가하여 부모보기에서 터치를 흡수합니다. 문제 해결됨!

참조 URL : https://stackoverflow.com/questions/5887305/uiview-user-interaction-enabled-false-on-parent-but-true-on-child

반응형