1

전체 화면을 덮는 오버레이보기 아래에있는 scrollView가 있습니다. 이 오버레이보기에는 미니보기가 있습니다. overlayView에 팬 제스처를 첨부했으며,이 팬 제스처가 위쪽/아래쪽으로 드래그되면 미니보기의 확대/축소를 애니메이션으로 나타냅니다. 내 목표는, 내가 scrollView의 맨 아래에 도달하면 위쪽으로 다른 스 와이프를 수행하면 overlayView의 팬 제스처를 호출하여 miniView의 성장을 애니메이션화합니다. 그러나이 위치에서 아래로 스 와이프하면 정상적으로 스크롤 뷰를 위로 스크롤합니다. 내 문제는 오버레이보기 내에서 터치를 유지하거나 정상적으로 스크롤 할 수있는 scrollView로 전달하는 방법을 파악할 수 없다는 것입니다. 어떻게 든 함수에 액세스 할 수 있어야합니다. 여기서 if 문 (scrollView.isAtCertainPoint & & swipeWasInCertainDirection)을 사용하고 scrollView 또는 overlayView에 이동을 전달할지 여부를 선택해야합니다. 여기 내 뷰 계층 구조입니다 :
-parent보기
----- 오버레이보기 ----------있는 ScrollView
--------- 미니보기 (수 있도록 OverlayView의 서브 뷰)제스처 인식기가 ScrollView 위에 오버레이 뷰에 붙어 있습니까?

나는 그것이 유용 할 경우 범블 앱의 위쪽/아래쪽을 스 와이프하여 다시 만들려고합니다. 미리 감사드립니다. 나는 어디에서나 찾아 보았지만 해결책을 찾지 못했습니다.

답변

1

음, 나는 내 자신의 질문에 대한 대답을 알아 냈습니다. 이것이 가장 효과적이고 깨끗한 방법인지는 모르지만 원하는 효과를 얻는 유일한 방법이었습니다. 여기 내 솔루션입니다 : 내 수 있도록 OverlayView, 나는이 기본적으로보기 내가 특정 기준에 따라 userInteraction을해야하는 경우 나 말을 할 수

override func point(inside point: CGPoint, with event: UIEvent?) -> Bool { 
    if miniView.frame.contains(point) || miniView.isOpen { 
     return true 
    } 
    //pass the tap onto other views 
    return false 
} 

overridded (탭 내 miniView 내부이었다 또는 miniView을 확대했다) . 그러나, 내가 거짓으로 돌아 왔을 때, 그것은 터치가지나 가게 할 것입니다. 이 메서드를 재정의하지 않고 overlayView에 userInteractionEnabled가 있으면 오버레이 뷰가 모든 터치를 그대로 사용합니다. 이 메서드를 사용하면 overlayView에 userInteractionEnabled를 유지할 수 있지만 터치가 다른 곳으로 전달되어야하는 시점을 결정할 수 있습니다.

그런 다음 parentView에 팬 제스처를 추가했습니다. 내가 parentView UIGestureRecognizerDelegate을 만들고,이 기능을 구현 :

override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool { 
    //if the final page is the first page (i.e. the user only has one pic), then we don't want swiping that could interfere with the card swipe. 
    if let pan = gestureRecognizer as? UIPanGestureRecognizer { 
     let velocity = pan.velocity(in: self) 
     let isVertical = abs(velocity.x) < abs(velocity.y) 
     let isUpwards = getPanDirection(velocity: velocity) == .up 
     return (theBumbleScrollView.isAtFinalPage && isVertical && isUpwards) || theBumbleDetailView.isOpen 
    } 
    return true 
} 

이 팬 제스처를 시작하려고했을 때 나를보고 허용을, 나는 (true 또는 false)을 반환 내용에 따라, 그것의 상태를 변경하는 것 팬 제스처를 위해. 기본적으로 제스처를 취소합니다. 이것에 대한 유용한 스택 오버플로 게시물입니다 : Limit UIView movement to only vertical or horizontal axis

내 팬 제스처는 지정된 기준에 따라 실패했습니다. 내 사용자 정의 팬 제스처가 팬 일 경우 제스처가 팬에 적용될 수 있다고 scrollView에 알려야했습니다. 실패한. 내가 부모보기에 팬 제스처를 설정

let pan = UIPanGestureRecognizer(target: self, action: #selector(self.isPanning(pan:))) 
    pan.delegate = self 
    self.addGestureRecognizer(pan) 
    theScrollView.panGestureRecognizer.require(toFail: pan) 

, 나는 기본적으로 (사과가 자동으로 내장), 스크롤 뷰의 팬 제스처를 말했다 :이 편리 라인에서 (... toFail)가 필요 온 곳이다 커스텀 팬 제스처가 실패 할 경우, 다음 라인에 있어야합니다.

그건 내가 내 scrollView에서 스크롤 할 수있는 솔루션 이었지만 다른 시간에 내 overlayView를 스크롤 할 수있었습니다. 나는 누군가를 구할 수 있기를 희망합니다. 또한 샘플 코드를보고 싶으면 내 샘플 프로젝트의 github 저장소 (보기의 이름이 다릅니다)를 만들었습니다. https://github.com/danielchangsoojones/Bumble-App-Clone/tree/master