适用于iOS 5.1及更低版本的UISplitViewController中的UIPopoverController手势处理

5St*_*yan 2 objective-c gestures uisplitviewcontroller uipopovercontroller ios5

我(以及其他许多人)已经注意到Apple改变了popover控制器的外观以使用"滑块"窗口,而不是我使用的通常的"popover"tableview.虽然我对新外观感到满意,但就像其他人一样,我遇到了滑动手势的问题:

iOS 5.1滑动手势被UISplitViewController劫持 - 如何避免?

对此的修复似乎是将拆分视图控制器方法"presentWithGesture"设置为"NO".

UISplitViewController *splitViewController = [[UISplitViewController alloc] init];
splitViewController.presentsWithGesture = NO;
Run Code Online (Sandbox Code Playgroud)

如果用户使用iOS 5.1,这非常有用,但是,如果使用iOS 5.0或更低版本运行此代码,则抛出异常,因为此方法仅适用于iOS 5.1:

Terminating app due to uncaught exception 'NSInvalidArgumentException', 
reason: '-[UISplitViewController setPresentsWithGesture:]: unrecognized selector 
Run Code Online (Sandbox Code Playgroud)

是否有可能在不使用此方法的情况下摆脱此手势,以便它向后兼容iOS 5.0及以下版本?

ecl*_*lux 9

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

if ([mySplitViewController respondsToSelector:@selector(setPresentsWithGesture:)]) {
    [mySplitViewController setPresentsWithGesture:NO];
}
Run Code Online (Sandbox Code Playgroud)

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

  • 如果要在添加视图后更改属性,则可以使用以下代码:[spv.view setNeedsLayout]; spv.delegate = nil; spv.delegate = self; (4认同)