gpt4 book ai didi

ios - 使用 UIScreenEdgePanGestureRecognizer 扩展 PKRevealController

转载 作者:行者123 更新时间:2023-11-29 02:21:09 25 4
gpt4 key购买 nike

我正在尝试使用 PKRevealController,它在前 View Controller 上带有 UIPanGestureRecognizer,因此平移会显示左 View Controller 。我不想仅当滑动来自屏幕边缘时才进行这种平移。我知道我必须使用 UIScreenEdgePanGestureRecognizer 而不是 UIPanGestureRecognizer。当显示左 View Controller 时,我还需要在前 View Controller 上使用 UIPanGestureRecognizer,这样用户就可以向后滑动前 View Controller 。

做这件事并不容易,所以我决定子类化 PKRevealController 并添加新的 UIScreenEdgePanGestureRecognizer 并覆盖一些方法来达到这个效果。但是处理手势的方法都没有在类扩展中声明。所以我无法在我的 super 类中访问它们。

最终决定对PKRevealController的源代码进行修改。我进行了所有更改,并且它正在按照我的意愿运行。 但我知道我们应该只继承第三方框架并扩展它们的功能,而不是直接更改源代码。但我没有找到任何解决办法。

是否有任何解决办法,无需更改 PKRevealController 源代码本身。任何建议都会非常有帮助。

最佳答案

有趣的是,几周前我遇到了同样的问题。我没有找到一种简单且完全干净的方法来解决这个问题,但我确实设法通过子类化 PKRevealController 并适度地“侵入”(这并不意味着它不能破坏库的 future 更新)。

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

@property (nonatomic, strong) UIScreenEdgePanGestureRecognizer *screenEdgePanGestureRecognizer;

初始化中:

// 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;

请注意, Action 选择器 (didRecognizePanGesture:) 由父类(super class)实现。

然后,为了安装我自己的手势识别器而不是内置的,我覆盖了 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,实现使用屏幕边缘识别器的选项(或者使整个手势架构更具可扩展性)并提交一个拉取请求。 :-)

关于ios - 使用 UIScreenEdgePanGestureRecognizer 扩展 PKRevealController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28116538/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com