禁用 UIPageViewController 滑动 - Swift

6
在我的项目中,我使用UIPageViewController来在5个子UIViewController之间切换。在某些子视图控制器中,我需要禁用UIPageViewController的滑动手势,以便当用户滑动时不会切换到其他视图。那么我该如何从子视图控制器中禁用滑动呢?
感谢您的帮助...谢谢

当 child1 正在呈现时,userInteraction = false。 - Tho Nguyen
请查看我的答案:https://dev59.com/uWEh5IYBdhLWcg3wvFbY#74746243 - Shahriyar
2个回答

24
在您的页面视图控制器中添加以下内容
override func viewDidLoad(){
    super.viewDidLoad()
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(yourpageviewcontroller.enableSwipe(_:)), name:"enableSwipe", object: nil)
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(yourpageviewcontroller.disableSwipe(_:)), name:"disableSwipe", object: nil)

}
func disableSwipe(notification: NSNotification){
    self.dataSource = nil
}

func enableSwipe(notification: NSNotification){
    self.dataSource = self
}

在您的子视图控制器中,您可以按照以下步骤发布通知。

NSNotificationCenter.defaultCenter().postNotificationName("enableSwipe", object: nil)

或者

NSNotificationCenter.defaultCenter().postNotificationName("disableSwipe", object: nil)

嗨,它可以用于滑动操作,但由于我的子视图具有UITableView,它也会阻止上下滚动。如何使表格视图保持滚动?谢谢。 - Voyager
请检查你的子视图的“用户交互启用”选项,并且在你的tableView中,确保勾选了“滚动启用”复选框。 - Rurouni
事实证明,我检查偏移量的逻辑是错误的。所以我接受了答案。谢谢! - Voyager
非常感谢,这是一个非常清晰的答案,加一分 :) - mAc
1
这正是我需要的!我不知道通知中心可以做那种事情!谢谢啊! - arvidurs

6

您可以使用此扩展:

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
               }
           }
       }
   }    
}

并调用此函数:
pageCtrl.isPagingEnabled = false

有用的扩展 - Masoud Roosta
除非苹果公司改变视图层次结构,即滚动视图位于某种容器视图内部。 - Ash

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接