[ios] UIPageViewController의 스 와이프 동작을 어떻게 비활성화합니까?

내 경우에는 부모 UIViewControllerUIPageViewController포함 UINavigationController하는 포함 UIViewController합니다. 마지막 뷰 컨트롤러에 스 와이프 제스처를 추가해야하지만 스 와이프는 마치 페이지 뷰 컨트롤러에 속하는 것처럼 처리됩니다. 프로그래밍 방식과 xib를 통해이 작업을 시도했지만 결과는 없습니다.

내가 이해하는 것처럼 UIPageViewController제스처를 처리 할 때까지 목표를 달성 할 수 없습니다 . 이 문제를 해결하는 방법?



답변

UIPageViewController스크롤 을 방지하는 문서화 된 방법 은 dataSource속성을 할당하지 않는 것 입니다. 데이터 소스를 할당하면이를 방지하려는 ‘제스처 기반’탐색 모드로 이동합니다.

데이터 소스가없는 경우 setViewControllers:direction:animated:completion방법 을 원할 때 수동으로 뷰 컨트롤러를 제공하면 필요 에 따라 뷰 컨트롤러간에 이동할 수 있습니다.

위의 내용은 Apple의 UIPageViewController 문서 (개요, 두 번째 단락) 에서 추론 할 수 있습니다 .

제스처 기반 탐색을 지원하려면 데이터 소스 객체를 사용하여 뷰 컨트롤러를 제공해야합니다.


답변

for (UIScrollView *view in self.pageViewController.view.subviews) {

    if ([view isKindOfClass:[UIScrollView class]]) {

        view.scrollEnabled = NO;
    }
}


답변

user2159978의 답변 을 Swift 5.1로 번역합니다.

func removeSwipeGesture(){
    for view in self.pageViewController!.view.subviews {
        if let subView = view as? UIScrollView {
            subView.isScrollEnabled = false
        }
    }
}


답변

@lee (@ user2159978) 솔루션을 확장으로 구현 :

extension UIPageViewController {
    var isPagingEnabled: Bool {
        get {
            var isEnabled: Bool = true
            for view in view.subviews {
                if let subView = view as? UIScrollView {
                    isEnabled = subView.isScrollEnabled
                }
            }
            return isEnabled
        }
        set {
            for view in view.subviews {
                if let subView = view as? UIScrollView {
                    subView.isScrollEnabled = newValue
                }
            }
        }
    }
}

사용법 : (에서 UIPageViewController)

self.isPagingEnabled = false


답변

나는 이것을 잠시 동안 싸워 왔고 Jessedc의 대답에 따라 해결책을 게시해야한다고 생각했다. PageViewController의 데이터 소스를 제거합니다.

내 PgeViewController 클래스에이를 추가 (스토리 보드에 내 페이지 뷰 컨트롤러에 연결, 상속 둘 UIPageViewControllerUIPageViewControllerDataSource) :

static func enable(enable: Bool){
    let appDelegate  = UIApplication.sharedApplication().delegate as! AppDelegate
    let pageViewController = appDelegate.window!.rootViewController as! PgeViewController
    if (enable){
        pageViewController.dataSource = pageViewController
    }else{
        pageViewController.dataSource = nil
    }
}

그런 다음 각 하위 뷰가 나타날 때 호출 할 수 있습니다 (이 경우 비활성화).

override func viewDidAppear(animated: Bool) {
    PgeViewController.enable(false)
}

나는 이것이 누군가를 도울 수 있기를 희망합니다.

편집 : 누군가 이것을 Objective-C로 번역하려면 🙂


답변

편집 :이 답변은 페이지 말림 스타일에만 적용됩니다. Jessedc의 대답 은 훨씬 낫습니다. 스타일에 관계없이 작동하며 문서화 된 동작에 의존합니다 .

UIPageViewController 동작 인식기 배열을 표시하며이를 사용하지 않도록 설정할 수 있습니다.

// myPageViewController is your UIPageViewController instance
for (UIGestureRecognizer *recognizer in myPageViewController.gestureRecognizers) {
    recognizer.enabled = NO;
}


답변

당신이 원하는 경우 UIPageViewController콘텐츠 컨트롤이 자신의 기능을 (문지 삭제 등)에 사용할 수 있도록하면서, 슬쩍 그것의 기능을 유지 단지 끕니다 canCancelContentTouchesUIPageViewController.

이것을 당신 UIPageViewControllerviewDidLoad기능 에 넣으십시오 . (빠른)

if let myView = view?.subviews.first as? UIScrollView {
    myView.canCancelContentTouches = false
}

UIPageViewController제스처를 처리하는 자동 생성 된 하위보기가 있습니다. 이러한 서브 뷰가 컨텐츠 제스처를 취소하지 못하게 할 수 있습니다.

에서…

pageViewController 안에있는 tableView에서 스 와이프하여 삭제