使用UIScreenEdgePanGestureRecognizer扩展PKRevealController

时间:2015-01-23 18:38:27

标签: ios objective-c subclassing

我尝试使用PKRevealController,它在前视图控制器上附带UIPanGestureRecognizer,因此平移会显示左视图控制器。只有当滑动来自屏幕边缘时,我才能进行此平移。我知道我必须使用UIScreenEdgePanGestureRecognizer而不是UIPanGestureRecognizer。当显示左视图控制器时,我还需要前视图控制器上的UIPanGestureRecognizer,以便用户可以向后滑动前视图控制器。

执行此操作并不容易,因此我决定继承PKRevealController并添加新的UIScreenEdgePanGestureRecognizer并覆盖此方法的一些方法。但是在类扩展中没有声明处理手势的方法。所以我无法在我的超级课程中访问它们。

最后决定在PKRevealController的源代码中进行更改。我做了所有的改变,它按照我的意愿工作。 但我知道我们应该只对第三方框架进行子类化并扩展其功能,而不是直接更改源代码。但我没有找到任何解决方法。

是否有任何解决方法没有在PKRevealController源代码本身进行更改。任何建议都会有很大帮助。

2 个答案:

答案 0 :(得分:1)

有趣的是,几个星期前我遇到了同样的问题。我没有找到一种简单而彻底的方法来解决这个问题,但我确实设法通过子类化PKRevealController并适度“侵入”(这并不意味着它不能打破未来的更新) lib)。

所以,我做的是创建我自己的UIScreenEdgePanGestureRecognizer并将其存储在一个属性中(这里的所有内容都在我的PKRevealController子类中):

@property (nonatomic, strong) UIScreenEdgePanGestureRecognizer *screenEdgePanGestureRecognizer;
init中的

// use screen edge pan gesture recognizer instead of normal built-in pan gesture recognizer
self.recognizesPanningOnFrontView = NO; // disable built-in pan gesture recognizer

self.screenEdgePanGestureRecognizer = [[UIScreenEdgePanGestureRecognizer alloc] initWithTarget:self
                                                                                        action:@selector(didRecognizePanGesture:)];
self.screenEdgePanGestureRecognizer.maximumNumberOfTouches = 1;
self.screenEdgePanGestureRecognizer.edges = UIRectEdgeLeft;

注意,动作选择器(didRecognizePanGesture:)是由超类实现的。

然后,为了安装我自己的手势识别器而不是内置手势识别器,我覆盖了updatePanGestureRecognizerPresence

// overwritten to use our custom screen edge pan gesture recognizer!
- (void)updatePanGestureRecognizerPresence
{
    if (![self.frontView.gestureRecognizers containsObject:self.screenEdgePanGestureRecognizer]) {
        [self.frontView addGestureRecognizer:self.screenEdgePanGestureRecognizer];
    }
}

由于我们正在访问PKRevealController的一些非公开声明的内容(正如您已经注意到的那样),我们需要让它可见(在@implementation之前):

// make private superclass stuff visible to be able to use a screen edge gesture recognizer
@interface PKRevealController ()
@property (nonatomic, strong, readwrite) PKRevealControllerView *frontView;
- (void)didRecognizePanGesture:(UIPanGestureRecognizer *)panGestureRecognizer;
@end

它工作得很好,这是我能找到的最好的方法,而不必分叉PKRevealController本身。这肯定有点脆弱,但是因为我可以完全控制升级PKRevealController的时间,这对我来说没问题。

当然,您可以做的最好的事情是fork PKRevealController,实现使用屏幕边缘识别器的选项(或使整个手势架构更具可扩展性)并提交拉取请求。 : - )

答案 1 :(得分:0)

我发现了另一个正在开发的应用程序抽屉,它提供了从边缘平移到动画的所有强大功能。这是https://github.com/mutualmobile/MMDrawerController的链接。它不会花太多时间来升级您的项目以使用新的DrawerController或Reveal控件。

主要的是扩展此框架以增加更多功能,并且团队正在积极地为项目做出贡献。