IT박스

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

itboxs 2020. 7. 24. 07:54
반응형

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로 번역합니다.

func removeSwipeGesture(){
    for view in self.pageViewController!.view.subviews {
        if let subView = view as? UIScrollView {
            subView.scrollEnabled = 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의 대답 은 훨씬 낫습니다. 스타일에 관계없이 작동하며 문서화 된 동작에 의존합니다 .

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

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

나는 이것을 잠시 동안 싸워 왔고 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로 번역하려면 :)


If you want your UIPageViewController to maintain it's ability to swipe, while allowing your content controls to use their features (Swipe to delete, etc), just turn off canCancelContentTouches in the UIPageViewController.

Put this in your UIPageViewController's viewDidLoad func. (Swift)

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

The UIPageViewController has an auto-generated subview that handles the gestures. We can prevent these subviews from cancelling content gestures.

From...

Swipe to delete on a tableView that is inside a pageViewController


A useful extension of UIPageViewController to enable and disable swipe.

extension UIPageViewController {

    func enableSwipeGesture() {
        for view in self.view.subviews {
            if let subView = view as? UIScrollView {
                subView.isScrollEnabled = true
            }
        }
    }

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

I solved it like this (Swift 4.1)

if let scrollView = self.view.subviews.filter({$0.isKind(of: UIScrollView.self)}).first as? UIScrollView {
             scrollView.isScrollEnabled = false
}

Similar to @user3568340 answer

Swift 4

private var _enabled = true
    public var enabled:Bool {
        set {
            if _enabled != newValue {
                _enabled = newValue
                if _enabled {
                    dataSource = self
                }
                else{
                    dataSource = nil
                }
            }
        }
        get {
            return _enabled
        }
    }

Swifty way for @lee answer

extension UIPageViewController {
    var isPagingEnabled: Bool {
        get {
            return scrollView?.isScrollEnabled ?? false
        }
        set {
            scrollView?.isScrollEnabled = newValue
        }
    }

    var scrollView: UIScrollView? {
        return view.subviews.first(where: { $0 is UIScrollView }) as? UIScrollView
    }
}

Translating @user2159978's response to C#:

foreach (var view in pageViewController.View.Subviews){
   var subView = view as UIScrollView;
   if (subView != null){
     subView.ScrollEnabled = enabled;
   }
}

Thanks to @user2159978's answer.

I make it a little more understandable.

- (void)disableScroll{
    for (UIView *view in self.pageViewController.view.subviews) {
        if ([view isKindOfClass:[UIScrollView class]]) {
            UIScrollView * aView = (UIScrollView *)view;
            aView.scrollEnabled = NO;
        }
    }
}

(Swift 4) You can remove gestureRecognizers of your pageViewController:

pageViewController.view.gestureRecognizers?.forEach({ (gesture) in
            pageViewController.view.removeGestureRecognizer(gesture)
        })

If you prefer in extension:

extension UIViewController{
    func removeGestureRecognizers(){
        view.gestureRecognizers?.forEach({ (gesture) in
            view.removeGestureRecognizer(gesture)
        })
    }
}

and pageViewController.removeGestureRecognizers


Declare it like this:

private var scrollView: UIScrollView? {
    return pageViewController.view.subviews.compactMap { $0 as? UIScrollView }.first
}

Then use it like this:

scrollView?.isScrollEnabled = true //false

참고URL : https://stackoverflow.com/questions/22098493/how-do-i-disable-the-swipe-gesture-of-uipageviewcontroller

반응형