2017-12-20 12 views
-1

사용자가 tableView 맨 아래로 스 와이프하면 현재 viewcontroller를 닫으려고합니다. tableview가 전체 화면을 차지하므로 제스처와 tableView의 제스처가 충돌합니다.팬 제스처 인식기가 아래로 스 와이프 할 때만 응답하고 테이블 뷰의 맨 위에있는 경우

사용자가 테이블 뷰 (tableView.contentOffset.y == 0.0)를 스크롤하지 않고 스 와이프의 방향이 아래쪽 인 경우 내 UIPanGestureRecognizer 만 응답한다고 생각했습니다. 그러나, 나는 이것을 수행하지 못했습니다. 제가 비슷한 질문에 주위를 둘러 보았다했지만 답변을 아무도 나를 위해 일하지

var tableGesture: UIPanGestureRecognizer? 
var oPosition: CGPoint? 
var currentPosition: CGPoint? 
@IBOutlet weak var table: UITableView! 

override func viewDidLoad() { 
    super.viewDidLoad() 
    table.delegate = self 
    table.dataSource = self 

    tableGesture = UIPanGestureRecognizer(target: self, action: #selector(tableGesture(_:))) 
    table.addGestureRecognizer(tableGesture!) 
} 

override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool { 
    let translation = tableGesture?.translation(in: table) 
    return translation!.y > 0 && table.contentOffset.y == 0.0 
} 

:

이 내 코드입니다.

+0

왜 downvote? 내가 뭔가를 놓친 경우에 대비하여 설명을 고맙게 생각합니다. –

답변

0

가장 쉬운 방법은 tableView 위에 또 다른 명확한보기를 추가하고이 동작에 팬 제스처 인식기를 추가하는 것입니다. 그것은 아주 짧을 수 있습니다 (나는 20 점을 시도했으나 잘 동작합니다). scrollViewDidScroll을 재정의하고 contentOffset.y < = 0 일 때만 isHidden을 true로 설정할 수 있습니다. 보이지 않는 뷰는 이제 tableView의 맨 위에있을 때만 tableview의 상위 20 포인트에서 시작하는 팬을 감지합니다.

+0

정말로 간단한 해결책이었습니다. –

0

이것은 두 동작이 활성화되어 동일한 이벤트를 감지하는 단일 동작 Top 또는 Bottom 스 와이프를 처리하는 데 매우 중요합니다.

간단한 논리적 인 해결책은 내가
가있는 tableview의 제로입니다 테이블 행 인덱스가 제로 또는 테이블 스크롤 오프셋 내용 인 경우 스크롤 위치를 감지 제안 할 수 있습니다 : 이벤트 닫기를 슬쩍을 확인/뷰 컨트롤러를 닫습니다. Scrolling Delegate in TableView

+0

그래서'tableView' 자신의 제스처 핸들러를 사용할 것을 제안합니까? –

0

나는 이것이 당신이 필요로하는 무엇을 당신이 원하는, 이해하는 경우 - :

다음은 사용할 수있는 솔루션의 유사한 종류이다.

tableview가 scrollview임을 고려하면이 함수는 사용자가 테이블을 스크롤 할 때마다 실행되며 table.contentOffset.y를 호출하여 스크롤 좌표를 가져올 수 있습니다.

var lastContentOffset: CGFloat = 0 

func scrollViewDidScroll(_ scrollView: UIScrollView) { 

    print("the user scrolled down",table.contentOffset.y) 


    if (self.lastContentOffset > tableView.contentOffset.y) { 
     //scrolling up 

    } 
    else if (self.lastContentOffset < tableView.contentOffset.y) { 
     // scrolling down 

     // dismiss your view here. 

    } 


    if table.contentOffset.y < 5 { 

     // the following code will be called when the user scrolls back up 

     // show the view again if thats what you need 


    } 


    self.lastContentOffset = scrollView.contentOffset.y 
} 
+0

답장을 보내 주셔서 감사합니다.이 방법을 사용해 보았지만 불행히도 그 결과는 다소 버그가있었습니다. –

관련 문제