use*_*978 114 uiviewcontroller uigesturerecognizer ios uipageviewcontroller
在我的情况下,父UIViewController包含UIPageViewController哪个包含UINavigationController哪个包含UIViewController.我想向最后一个视图控制器添加滑动手势,但滑动处理就像它们属于页面视图控制器一样.我尝试以编程方式和通过xib执行此操作,但没有结果.
据我了解,在UIPageViewController处理手势之前我无法实现目标.如何解决这个问题?
Jes*_*edc 237
记录的防止UIPageViewController滚动的方法是不分配dataSource属性.如果您分配数据源,它将进入"基于手势"的导航模式,这是您要阻止的.
如果没有数据源,您可以在需要时使用setViewControllers:direction:animated:completion方法手动提供视图控制器,并且它将根据需要在视图控制器之间移动.
以上内容可以从Apple的UIPageViewController文档(概述,第二段)中推断出来:
要支持基于手势的导航,必须使用数据源对象提供视图控制器.
use*_*978 82
for (UIScrollView *view in self.pageViewController.view.subviews) {
if ([view isKindOfClass:[UIScrollView class]]) {
view.scrollEnabled = NO;
}
}
Run Code Online (Sandbox Code Playgroud)
lee*_*lee 49
我将user2159978的答案翻译成Swift
func removeSwipeGesture(){
for view in self.pageViewController!.view.subviews {
if let subView = view as? UIScrollView {
subView.scrollEnabled = false
}
}
}
Run Code Online (Sandbox Code Playgroud)
Lin*_*rth 25
实施@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
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
用法:(中UIPageViewController)
self.isPagingEnabled = false
Run Code Online (Sandbox Code Playgroud)
编辑:此答案仅适用于页面卷曲样式.Jessedc的答案要好得多:无论风格如何都有效,并依赖于记录在案的行为.
UIPageViewController 暴露其手势识别器数组,您可以使用它来禁用它们:
// myPageViewController is your UIPageViewController instance
for (UIGestureRecognizer *recognizer in myPageViewController.gestureRecognizers) {
recognizer.enabled = NO;
}
Run Code Online (Sandbox Code Playgroud)
我已经打了一段时间了,我认为我应该发布我的解决方案,继耶塞德克的回答之后; 删除PageViewController的数据源.
我将它添加到我的PgeViewController类(链接到故事板中的页面视图控制器,继承UIPageViewController和UIPageViewControllerDataSource):
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
}
}
Run Code Online (Sandbox Code Playgroud)
然后可以在每个子视图出现时调用它(在这种情况下禁用它);
override func viewDidAppear(animated: Bool) {
PgeViewController.enable(false)
}
Run Code Online (Sandbox Code Playgroud)
我希望这可以帮助别人,它不像我想的那样干净,但不会觉得太hacky等.
编辑:如果有人想将其翻译成Objective-C请做:)
如果您希望UIPageViewController保持其滑动功能,同时允许内容控件使用其功能(滑动以删除等),只需canCancelContentTouches在中将其关闭即可UIPageViewController。
将此放入您UIPageViewController的viewDidLoadfunc。(迅速)
if let myView = view?.subviews.first as? UIScrollView {
myView.canCancelContentTouches = false
}
Run Code Online (Sandbox Code Playgroud)
该UIPageViewController有一个自动生成的子视图处理该手势。我们可以防止这些子视图取消内容手势。
从...
滑动以删除pageViewController内的tableView
小智 5
一个有用的扩展,UIPageViewController用于启用和禁用滑动。
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
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
@lee回答的快捷方式
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
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
73006 次 |
| 最近记录: |