【问题标题】:detect and log all gestures检测并记录所有手势
【发布时间】:2015-01-05 15:57:41
【问题描述】:

是否有一种方法可以检测并记录项目和/或所有潜在触摸响应者收到的所有手势消息?

我正在编写一个新的 iOS 8 主/详细通用项目,该项目在默认滑动返回行为和基于手指的绘图之间遇到冲突。然而,当我尝试通过例如gestureRecognizerShouldBegin 记录细节控制器上的手势行为时,代码永远不会被调用。

【问题讨论】:

  • 您是否尝试仅记录 touchesBegan、touchesMoved、ended 等?
  • 是的,我确实尝试过,但是他们没有在我测试的视图/viewController 中触发。我希望有一个结构化和可重用的解决方案。

标签: ios logging uigesturerecognizer


【解决方案1】:

我通过遍历我的 viewControllers.views 列表来识别子视图,然后记录每个手势识别器 - 或我感兴趣的任何其他东西 - 与每个视图相关联,从而解决了这个问题。 为了迭代视图,如果我对视图进行了子类化,我会使用建议的递归方法here。因为没有,所以稍微修改了代码here

然后,我编写了实用函数以供将来使用:

+ (NSMutableArray *)getAllSubviews:(UINavigationController *)navigationController {

    NSMutableArray *allSubviews     = [[NSMutableArray alloc] initWithObjects: nil];
    NSMutableArray *currentSubviews = [[NSMutableArray alloc] initWithObjects: nil];
    NSMutableArray *foundSubviews     = [[NSMutableArray alloc] initWithObjects: nil];

    NSLog(@"\n%lu total controllers:\n%@",navigationController.viewControllers.count, navigationController.viewControllers);

    for (UIViewController *vc in navigationController.viewControllers) {
        [currentSubviews addObject: vc.view];
        [foundSubviews addObject: vc.view];

        while (foundSubviews.count) {

            [foundSubviews removeAllObjects];

            for (UIView *view in currentSubviews) {

                for (UIView *subview in view.subviews)
                    [foundSubviews addObject:subview];
            }

            [currentSubviews removeAllObjects];
            [currentSubviews addObjectsFromArray:foundSubviews];
            [allSubviews addObjectsFromArray:foundSubviews];

        }
    }
    NSLog(@"\n%lu total subviews:\n%@",allSubviews.count, allSubviews);

    return allSubviews;
}
+ (void)logAllGestureRecognizers:(UINavigationController *)navigationController {

    NSMutableArray *allViews = [self getAllSubviews: navigationController];

    for (UIView *v in allViews) {
        for (UIGestureRecognizer *gestureRecognizer in v.gestureRecognizers) {
            NSLog(@"Gesture Recognizer  %@", gestureRecognizer);
        }
    }
}

使用[YourUtilityObject logAllGestureRecognizers:self.navigationController];调用函数

一个警告:这个实现假设 self.navigationController 知道你所有的活动视图控制器。如果您正在为当前的 viewController 创建一个新的 navigationController,那么结果将只显示与该 navigationController 关联的视图,并且您必须为每个导航控制器手动调用该函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多