@implementation TheCustomCell- (voID)drawWithFrame:(NSRect)cellFrame inVIEw:(NSVIEw *)controlVIEw { // varIoUs NSTextFIEldCells NSTextFIEldCell *TitleCell = [[NSTextFIEldCell alloc] init]; .... // my custom NSbuttonCell MybuttonCell *warningCell = [[MybuttonCell alloc] init]; [warningCell setTarget:self]; [warningCell setAction:@selector(testbutton:)]; [warningCell drawWithFrame:buttonRect inVIEw:controlVIEw];}
我遇到的问题是:在这个NSCell内部的button(更确切地说:NSbuttonCell)能够正常工作的最佳/正确的方法是什么? “工作”表示:触发分配的动作消息,并在点击时显示备用图像.开箱即用,该按钮在单击时不执行任何 *** 作.
关于这个主题的信息/阅读很难找到.我在网上找到的唯一的职位指出我要实施
- (BOol)trackMouse:(NSEvent *)theEvent inRect:(NSRect)cellFrame ofVIEw:(NSVIEw *)controlVIEw untilMouseUp:(BOol)untilMouseUp;
这是正确的做法吗?实现trackMouse:在我的NSCell中?然后将事件转发到NSbuttonCell?我会期望NSbuttonCell本身知道当它被点击时该怎么办(我看到trackMouse:更多的方法更真实地跟踪鼠标移动 – 而不是作为“标准”点击行为的训练轮).但是,当它包含在一个单元格本身时,它似乎不会这样做
似乎我没有把握自定义单元格的大图,但是
如果有人可以从自己的经验中回答这个问题(或指点某些教程等),我会很高兴,并告诉我,如果我在正确的轨道上.
提前致谢,
托比
>在鼠标向下按钮之后,只要鼠标悬停就必须按下.
>如果鼠标然后释放按钮,您的单元格必须发送相应的动作消息.
要使按钮看起来按压,您需要根据需要更新按钮单元格的突出显示的属性.单独改变状态将不会达到这一目的,但是如果只有,如果它的状态是NSOnState,你想要的是按钮被突出显示.
要发送动作消息,您需要注意鼠标何时释放,然后使用 – [NSApplication sendAction:to:from:]发送消息.
为了能够发送这些消息,您需要参考NSCell提供的事件跟踪方法.请注意,除最终的-stopTracking:…方法之外,所有这些跟踪方法都返回一个布尔值来回答“您要继续接收跟踪消息吗?”的问题.
最后的扭曲是,为了发送任何跟踪消息,您需要实现-hitTestForEvent:inRect:ofVIEw:并返回适当的位元素NSCellHit …值.具体来说,如果返回的值没有NSCellHitTrackableArea值,则不会得到任何跟踪消息!
所以,在高层次上,你的实现将如下所示:
- (NSUInteger)hitTestForEvent:(NSEvent *)event inRect:(NSRect)cellFrame ofVIEw:(NSVIEw *)controlVIEw { NSUInteger hitType = [super hitTestForEvent:event inRect:cellFrame ofVIEw:controlVIEw]; NSPoint location = [event locationInWindow]; location = [controlVIEw convertPointFromBase:location]; // get the button cell's |buttonRect|,then if (NSMouseInRect(location,buttonRect,[controlVIEw isFlipped])) { // We are only sent tracking messages for trackable areas. hitType |= NSCellHitTrackableArea; } return hitType;}+ (BOol)prefersTrackingUntilMouseUp { // you want a single,long tracking "session" from mouse down till up return YES;}- (BOol)startTrackingAt:(NSPoint)startPoint inVIEw:(NSVIEw *)controlVIEw { // use NSMouseInRect and [controlVIEw isFlipped] to test whether |startPoint| is on the button // if so,highlight the button return YES; // keep tracking}- (BOol)continueTracking:(NSPoint)lastPoint at:(NSPoint)currentPoint inVIEw:(NSVIEw *)controlVIEw { // if |currentPoint| is in the button,highlight it // otherwise,unhighlight it return YES; // keep on tracking}- (voID)stopTracking:(NSPoint)lastPoint at:(NSPoint)stopPoint inVIEw:(NSVIEw *)controlVIEw mouseIsUp:(BOol)flag { // if |flag| and mouse in button's rect,then [[NSApplication sharedApplication] sendAction:self.action to:self.target from:controlVIEw]; // and,finally,[buttonCell setHighlighted:NO];}总结
以上是内存溢出为你收集整理的可可 – NSButtonCell内定制NSCell全部内容,希望文章能够帮你解决可可 – NSButtonCell内定制NSCell所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)