在Mac OS X上,触控板支持多种手势,一种是两次手指轻扫,可在页面上向上,向下,向左或向右滚动。 wxPython有一个面板来帮助创建滚动小部件wx.lib.scrolledpanel。然而,它不支持手势,这是一个真正的痛苦。
我试图修改NSView,因为它是普通的Objective C应用程序,但NSEvents使用子类的方法(touchesBeganWithEvent:等)作为通知和事件处理。这与wxPython中的Bind调用不同。如果Objective C允许猴子修补,那就没问题了......例如
def handleTouchBegin(event):
print "Hey a touch event has begun!"
view.touchBeganWithEvent_ = handleTouchBegin
但是你可以猜到PyObj C错误(因为Objective C不支持猴子修补或者没有任何干净和漂亮的方式)并且我收到以下错误
TypeError: cannot change a method
好吧,我可以做苹果所说的并将其子类化,但是对象已经创建了,所以我怎样才能捕获事件。当然还有
NSEvent addGlobalMonitorForEventsMatchingMask:
and
NSEvent addLocalMonitorForEventsMatchingMask:
但是那些也令人失望的是他们要么甚至不处理应用程序(与所有其他人进行全局交易),要么不处理单个NSView的事件(或者它是否和我被误导)。
那我该怎么做呢?我错过了另一个选项,我知道我读了一些关于NSResponder的内容,但是从我收集到的内容是NSView是什么,一个事件响应者,你没有添加一个NSView。
在QTKit中是否有观察者喜欢监视负载状态变化(https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/QTKitApplicationProgrammingGuide/AnatomyoftheQTKFramework/AnatomyoftheQTKFramework.html#//apple_ref/doc/uid/TP40008156-CH109-SW11)?
答案 0 :(得分:3)
ObjC不支持Python风格的monkeypatching ......但它确实支持一些类似的功能,如方法调配,类冒充,类别插入等.PyObjC可以做所有这些事情。
离开我的头顶,从PyObjC调来的应该是这样的:
def swizzle(cls, sel, func):
oldimp = cls.instanceMethodForSelector_(sel)
def wrapper(self, *args, **kwargs):
return func(self, oldimp, *args, **kwargs)
newmethod = objc.selector(wrapper,
selector=oldimp.selector, signature=oldimp.signature)
objc.classAddMethod(cls, sel, newmethod)
return wrapper