sourcecode

아래에 있는 UIView에 터치 전달

copyscript 2023. 8. 2. 09:19
반응형

아래에 있는 UIView에 터치 전달

나는 있습니다UIView4개의 버튼이 있고 또 다른 버튼이 있습니다.UIView버튼 보기의 맨 위에 있습니다.맨 위에 있는 보기에 다음이 포함됩니다.UIImageViewUITapGestureRecognizer그 위에

내가 만들려고 하는 행동은 사용자가 다음을 탭할 때입니다.UIImageView화면의 오른쪽 하단 모서리에 있는 작은 것과 애니메이션을 사용하여 큰 것 사이를 전환합니다.크기가 크면 아래쪽 보기의 버튼을 비활성화하고 크기가 작으면 오른쪽 아래 구석에 있는 버튼으로 터치가 전달되어 정상적으로 작동하기를 원합니다.는 거의 다 버튼을 .UserInteractions

내 안에 이것이 있습니다.initWithFrame: 위뷰의: 예:

// Add a gesture recognizer to the image view
UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(imageTapped:)];
tapGestureRecognizer.cancelsTouchesInView = NO;
[imageView addGestureRecognizer:tapGestureRecognizer];
[tapGestureRecognizer release];

는 제 그리나는입니다.imageTapped:방법:

- (void) imageTapped:(UITapGestureRecognizer *) gestureRecognizer {
    // Toggle between expanding and contracting the image
    if (expanded) {
        [self contractAnimated:YES];
        expanded = NO;
        gestureRecognizer.cancelsTouchesInView = NO;
        self.userInteractionEnabled = NO;
        self.exclusiveTouch = NO;
    }
    else {
        [self expandAnimated:YES];
        expanded = YES;
        gestureRecognizer.cancelsTouchesInView = NO;
        self.userInteractionEnabled = YES;
        self.exclusiveTouch = YES;
    }
}

위의 코드를 사용하면 이미지가 크면 버튼이 비활성화되고 이미지를 터치하면 축소되고 버튼이 활성화됩니다.그러나 작은 이미지는 터치를 받지 못해 확대되지 않습니다.

가 면하정으로 하면,self.userInteractionEnabled = YES두 경우 모두 터치하면 이미지가 확장되고 수축되지만 버튼은 터치를 수신하지 않고 비활성화된 것처럼 작동합니다.

이미지가 수축된 상태일 때 이미지가 확장되고 수축되지만 아래 버튼은 이미지가 수축된 상태일 때만 터치를 받을 수 있는 방법이 있습니까?내가 여기서 멍청한 짓을 하고 있고 명백한 것을 놓치고 있는 건가요?

어떤 도움이든 감사하게 생각하도록 이 일을 성공시키려고 노력하는 것은 정말 미친 짓입니다.

데이브

업데이트:

▁thero를 오버로딩했습니다.touchesBegan:그리고.touchesCancelled:UIImageView가 포함된 내 뷰에서 메서드와 슈퍼 구현을 호출했습니다.로 위의코드함께와,함께,touchesCancelled: 호되지않며으출며▁is▁the않으▁called▁and.touchesBegan:항상 호출됩니다.

따라서 보기가 터치를 받고 있는 것처럼 보이지만 아래 보기로 전달되지는 않습니다.

갱신하다

이것은 응답자 체인이 작동하는 방식 때문입니까?내 보기 계층은 다음과 같습니다.

VC - View1
     -View2
      -imageView1 (has tapGestureRecogniser)
      -imageView2
     -View3
      -button1
      -button2

내 생각에 OS는 먼저 View2가 앞에 있으니 터치를 모두 받아야 하며 사용자가 아니면 View3로 전달되지 않습니다.View2의 경우 Interactions(상호 작용)가 NO(아니오)로 설정되어 있으며, 이 경우 imageView1도 터치를 수신할 수 없습니다.이것이 작동 방식이며 View2가 View3의 터치를 통과할 수 있는 방법이 있습니까?

UIGesture Recognizer는 제가 생각하는 빨간 청어입니다.결국 이 문제를 해결하기 위해 저는 오버로드했습니다.pointInside:withEvent:나의 방법UIView:

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
    BOOL pointInside = NO;

    if (CGRectContainsPoint(imageView.frame, point) || expanded) pointInside = YES;

    return pointInside;
}

따라서 imageView를 누르거나 확장 플래그가 설정된 경우 뷰가 모든 터치를 트랩합니다.확장되지 않은 경우 터치가 이미지 보기에 있는 경우에만 트랩합니다.

최상위 수준 VC의 View는 NO를 반환하여 나머지 뷰 계층에 조회하여 히트를 찾습니다.

다음 항목을 선택ViewStoryboard또는XIB그리고...


enter image description here


또는 스위프트에서 스위프트

view.isUserInteractionEnabled = false

UIGesture Recognizer 딜러 프로토콜을 살펴봅니다.구체적으로.gestureRecognizer:shouldReceiveTouch:

당신은 각각을 만들고 싶을 것입니다.UIGestureRecognizer당신의 재산UIViewController,

// .h
@property (nonatomic, strong) UITapGestureRecognizer *lowerTap;

// .m
@synthesize lowerTap;

// When you are adding the gesture recognizer to the image view
self.lowerTap = tapGestureRecognizer

다음을 수행해야 합니다.UIViewController대표자,

[self.lowerTap setDelegate: self];

그러면 이런 거 있잖아요.

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    if (expanded && gestureRecognizer == self.lowerTap) {    
        return NO;
    }
    else {
        return YES;
    }
}

물론, 이것은 정확한 코드가 아닙니다.하지만 이것이 여러분이 따르고 싶은 일반적인 패턴입니다.

다른 해결책이 있습니다.나는 두 가지 견해가 있습니다, 그들을 부르죠.CustomSubView둘 다 감촉을 받아야 합니다그래서 저는 뷰 컨트롤러와 사용자 정의 UIView 클래스를 가지고 있습니다.ViewControllerView인터페이스 작성기에 설정한 다음 해당 보기에 터치를 수신해야 하는 두 개의 보기를 추가했습니다.

그래서 제가 감청을 했습니다.ViewControllerView히트를 덮어씀으로써 테스트:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    return self;
}

그 다음에 제가 글을 남겼습니다.ViewControllerView:

- (void)touchesBegan:(NSSet *)touches
           withEvent:(UIEvent *)event
{
    [super touchesBegan:touches withEvent:event];
    for (UIView *subview in [self.subviews reverseObjectEnumerator])
    {
        if ([subview isKindOfClass:[CustomSubView class]])
        {
            [subview touchesBegan:touches withEvent:event];
        }
    }
}

에도 동일한 작업 수행touchesMoved touchesEnded그리고.touchesCancelled.

@Magic Bullet Dave의 솔루션이지만 Swift에 있습니다.

스위프트 3

override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
    var pointInside = false
    if commentTextField.frame.contains(point) {
        pointInside = true
    } else {
        commentTextField.resignFirstResponder()
    }
    return pointInside
}

사용자가 새 사진을 찍는 동안 댓글을 달 수 있는 기능을 제공하기 위해 ImagePickerViewController용 CameraOverlayView에서 사용합니다.

언급URL : https://stackoverflow.com/questions/9026097/passing-through-touches-to-uiviews-underneath

반응형