gpt4 book ai didi

ios - 没有委托(delegate)方法的缩放 UIScrollView 的子类

转载 作者:可可西里 更新时间:2023-11-01 05:22:58 25 4
gpt4 key购买 nike

我想实现一个 UIScrollView 子类来呈现一些自定义格式的内容。我只是设置了 ScrollView 的模型对象属性,它处理所有需要的布局和渲染来显示内容。

这工作正常,但现在我想包括缩放。根据文档,要支持缩放,您必须设置委托(delegate)并实现 viewForZoomingInScrollView: 方法。我想我可以将委托(delegate)设置为 ScrollView 本身并在子类中实现该方法。但是这样做我将失去拥有可以通知滚动事件的外部委托(delegate)(如封装的 UIViewController)的能力。

假设文档是正确的,并且绝对没有(记录在案的)方法可以在没有委托(delegate)的情况下实现缩放,我怎么可能仍然保留有一个常规的、不相关的委托(delegate)的可能性?

最佳答案

基于 H2CO3 的建议,即保存指向真实委托(delegate)的隐藏指针并将所有传入消息转发给它,我提出了以下解决方案。

声明一个私有(private)委托(delegate)变量来存储对传递给 setDelegate: 的“真实”委托(delegate)的引用。方法:

@interface BFWaveScrollView ()
@property (nonatomic, weak) id<UIScrollViewDelegate> ownDelegate;
@end

将委托(delegate)设置为 self 以接收有关滚动事件的通知。使用 super , 所以原来的 setDelegate:实现被调用,而不是我们修改的实现。

- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
[super setDelegate:self];
}
return self;
}

覆盖 setDelegate:保存对“真实”委托(delegate)的引用。

- (void)setDelegate:(id<UIScrollViewDelegate>)delegate {
_ownDelegate = delegate;
}

UIScrollView 尝试调用其委托(delegate)的方法时,它将首先检查委托(delegate)是否为 respondsToSelector: .如果选择器是 UIScrollViewDelegate 的一部分,我们必须将其转发给真正的委托(delegate)人协议(protocol)(不要忘记 #import <objc/runtime.h> )。

- (BOOL)selectorIsScrollViewDelegateMethod:(SEL)selector {
Protocol *protocol = objc_getProtocol("UIScrollViewDelegate");
struct objc_method_description description = protocol_getMethodDescription(
protocol, selector, NO, YES);
return (description.name != NULL);
}

- (BOOL)respondsToSelector:(SEL)selector {
if ([self selectorIsScrollViewDelegateMethod:selector]) {
return [_ownDelegate respondsToSelector:selector] ||
[super respondsToSelector:selector];
}
return [super respondsToSelector:selector];
}

最后,将所有未在子类中实现的委托(delegate)方法转发给真正的委托(delegate):

- (id)forwardingTargetForSelector:(SEL)selector {
if ([self selectorIsScrollViewDelegateMethod:selector]) {
return _ownDelegate;
}
return [super forwardingTargetForSelector:selector];
}

不要忘记手动转发那些由子类实现的委托(delegate)方法。

关于ios - 没有委托(delegate)方法的缩放 UIScrollView 的子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15670491/

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