我使用一个开源的UIButton实现扩展,所以它是可拖动的。
这是UIButton+NMCategory
文件的头文件:
#import <UIKit/UIKit.h>
@interface UIButton (NMCategory)
@property(nonatomic,assign,getter = isDragEnable) BOOL dragEnable;
@property(nonatomic,assign,getter = isAdsorbEnable) BOOL adsorbEnable;
@end
,在它的实现中,它实现了onTouchesBegin
, onTouchesMoved
和onTouchesEnd
接口,这些接口都可以正常工作,并且该按钮可以拖动。
然而,在我项目的其余部分中,使用了另一种可拖动按钮的实现。这是它的标题:
@interface SEFilterKnob : UIButton
@end
下面是它的用法:
[knob addTarget:self action:@selector(MyTouchDown:withEvent:) forControlEvents:UIControlEventTouchDown];
[knob addTarget:self action:@selector(MyTouchUp:) forControlEvents:UIControlEventTouchUpInside | UIControlEventTouchUpOutside];
[knob addTarget:self action:@selector(MyTouchMove:withEvent:) forControlEvents: UIControlEventTouchDragOutside | UIControlEventTouchDragInside];
当我将UIButton+NMCategory
实现应用于整个项目时,SEFilterKnob
可拖动按钮停止工作,我看到它的触摸事件都路由到UIButton+NMCategory
触摸事件实现。(它自己的选择器没有被调用)
我不熟悉Obj-C的类别功能,有人能帮助解释为什么会发生这种情况吗?谢谢!
不幸的是,您不能将两者结合起来。此外,要非常注意Obj-C中类别的破坏性影响。
它们修改了类的所有实例,我肯定选择了旧的子类。这是最安全、最正确的决定。
在一个类别中,你通常倾向于覆盖当前的方法。
From developer.apple.com:"当一个类别覆盖了一个继承的方法时,该类别中的方法可以像往常一样,通过给super的消息调用继承的实现。但是,如果类别覆盖了类别类中已经存在的方法,则无法调用原始实现"
如果您喜欢调用旧的/重写的方法,您应该尝试swizzling,这是一个强大的obj-c特性(而且它不是一个hack!)。