从Gestures触发的动画无法处理PageViewController的子视图

时间:2016-08-03 07:59:44

标签: ios animation uicontainerview

我正在使用THIS LIB按钮,现在我有一个viewcontroller,它有一个容器视图,这个容器视图嵌入(segue)一个PageViewController,第二个页面(这是另一个ViewController)在这个PageViewController中有BFPaperButton(在onTap手势时具有波纹动画)。动画在这个设置中不起作用,但如果要将第二页的ViewController设为Is Initial View Controller那么动画效果很好,这里发生了什么?

修改

我进一步隔离了这个问题,似乎这只发生在使用PageViewController并在PageViewController的一个数据源委托方法中返回包含该按钮的ViewController时,

并且看起来原因绝对是PageViewController,它似乎阻止了一些手势识别器或者延迟它们的子视图,需要找出如何解决它。

1 个答案:

答案 0 :(得分:0)

在处理延迟其子视图内容触摸的某些类型的父视图时,您描述的效果非常常见。解决方案通常与设置父视图的属性一样简单:delaysContentTouches

我会记得这个,因为10次中有9次,这是罪魁祸首。

但是,对于UIPageViewController,您看到的是 UIQueuingScrollView 的默认行为,它不会公开该属性。解决这个问题的一种丑陋但有效的方法是深入了解UIPageViewController的子视图,直到找到一个UIGestureRecognizers,并设置delaysTouchesBegan = NO

您可以在初始化UIPageViewController

后运行此代码来执行此操作
NSArray *subviews = self.pageViewController.view.subviews;
NSArray *viewHierarchy = [@[self.pageViewController.view] arrayByAddingObjectsFromArray:subviews];
int i = 0;
for (UIView *viewToCheck in viewHierarchy) {
    for (UIGestureRecognizer *gestureRecognizer in viewToCheck.gestureRecognizers) {
        NSLog(@"%d gestureRecognizer: %@", i++, gestureRecognizer);
        gestureRecognizer.delaysTouchesBegan = NO;
    }
}
如果你愿意的话,这里有一个快速打好的Swift版本:

let subViews: [UIView] = pageViewController.view.subviews
var viewHierarchy: [UIView] = [pageViewController.view]
viewHierarchy.appendContentsOf(subViews)
var i = 0
for viewToCheck in viewHierarchy {
     viewToCheck.gestureRecognizers?.forEach { (recognizer) in
         print("viewToCheck isa \'\(viewToCheck.self)\'")
         for gestureRecognizer in viewToCheck.gestureRecognizers! {
             print("\(i) gestureRecognizer: \(gestureRecognizer)")
             i += 1
             gestureRecognizer.delaysTouchesBegan = false
          }
     }
}

由github用户bfeherfor this issue

回答