【问题标题】:UIPopoverController gesture handling in UISplitViewController for iOS 5.1 and belowiOS 5.1 及更低版本的 UISplitViewController 中的 UIPopoverController 手势处理
【发布时间】:2012-04-09 19:27:32
【问题描述】:

我(以及其他许多人)注意到 Apple 将弹出框控制器的外观更改为使用“滑块”窗口,而不是我使用的通常的“弹出框”表格视图。虽然我对新外观没问题,但和其他人一样,我对引入的滑动手势有问题:

iOS 5.1 swipe gesture hijacked by UISplitViewController - how to avoid?

解决此问题的方法似乎是将拆分视图控制器方法“presentWithGesture”设置为“NO”。

UISplitViewController *splitViewController = [[UISplitViewController alloc] init];
splitViewController.presentsWithGesture = NO;

如果用户使用的是 iOS 5.1,这很有效,但是,如果使用 iOS 5.0 或更低版本运行此代码,则会引发异常,因为此方法仅适用于 iOS 5.1:

Terminating app due to uncaught exception 'NSInvalidArgumentException', 
reason: '-[UISplitViewController setPresentsWithGesture:]: unrecognized selector 

是否可以不使用此方法摆脱此手势,使其向后兼容iOS 5.0及以下版本?

【问题讨论】:

    标签: objective-c ios5 uisplitviewcontroller uipopovercontroller gestures


    【解决方案1】:

    对于任何类型的向后兼容性,首先检查新属性的 setter 方法是否存在...

    if ([mySplitViewController respondsToSelector:@selector(setPresentsWithGesture:)]) {
        [mySplitViewController setPresentsWithGesture:NO];
    }
    

    请注意,显然您需要在将 UISplitViewController.view 添加到窗口之前执行此操作。我猜到那时会检查属性并添加或不添加手势识别器。如果在添加视图后更改属性,则没有明显的效果。

    【讨论】:

    • 如果要在添加视图后更改属性,可以使用以下代码:[spv.view setNeedsLayout]; spv.delegate = nil; spv.delegate = self;
    • 是的,我同意添加 spv.delegate = nil; spv.delegate = self 实际上确实允许您即时更改行为。干得好!
    猜你喜欢
    • 2012-03-30
    • 1970-01-01
    • 2019-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-26
    • 1970-01-01
    • 2012-07-27
    相关资源
    最近更新 更多