Objective c NSTextView重叠NSButton并使其不可拾取
我正在创建一个自定义的NSButton,由于我正在使用渐变视图对其进行子视图查看,默认的textView将消失。为了在textView上也有自定义的样式,我创建了一个自定义样式,并对其进行了子视图 按钮现在看起来像: 这是完美的。 但当我点击它时,NSButtonCell不会触发高亮显示方法(只有在我点击textView外部时才触发)(底部和顶部的间距为5px) 我如何才能(就像在iOS的UIButton中添加自定义标签一样)保持整个按钮的可点击性 任何帮助都将不胜感激Objective c NSTextView重叠NSButton并使其不可拾取,objective-c,macos,cocoa,nsbutton,Objective C,Macos,Cocoa,Nsbutton,我正在创建一个自定义的NSButton,由于我正在使用渐变视图对其进行子视图查看,默认的textView将消失。为了在textView上也有自定义的样式,我创建了一个自定义样式,并对其进行了子视图 按钮现在看起来像: 这是完美的。 但当我点击它时,NSButtonCell不会触发高亮显示方法(只有在我点击textView外部时才触发)(底部和顶部的间距为5px) 我如何才能(就像在iOS的UIButton中添加自定义标签一样)保持整个按钮的可点击性 任何帮助都将不胜感激 Sjors那么您想要在
Sjors那么您想要在
NSTextView
上单击事件吗
下面是一个解决方案。将NSTextView子类化
@interface ClickableTextView : NSTextView
@end
@implementation ClickableTextView
- (void)mouseDown:(NSEvent *)theEvent{
[self sendAction://action of the button that you want
to:self
];
}
@end
NSTextField是一个控件,因此可以捕获输入事件。您不应该使用它来显示按钮中的文本。NSButton将NSCell用于其绘图,因此最好将NSButtonCell子类化,并使用NSStringDrawing手动绘制字符串,但前提是您确实无法使用NSButtonCell的标准布局属性。这不是iOS,而有一种类似UILabel的轻量级文本绘制解决方案。相反,NSTextField会带来大量开销,会降低应用程序的速度,并且可能会在现在或将来为您带来不必要的错误
Tl;dr:不要使用NSTextField,自己绘制字符串。NSButton使用NSButtonCell进行所有绘制。最好的解决方案是不破坏可访问性,也不让标签显示为“标签”画外音按钮的另一个功能是子类NSButtonCell并覆盖它的-drawBezelWithFrame:inView:method在那里绘制自己的按钮边框
这就是说,如果您想使视图对单击“透明”,可以通过重写它从NSView继承的-hitTest:方法来实现。但是,您还必须确保将其设置为可访问性忽略,以避免奇怪
也许,与其使用NSView来绘制文本,更好的方法是使用CALayer。层比视图更轻,默认情况下不参与命中测试。甚至还有一种文本层类型负责正确绘制。这是苹果最近开始使用的(在10.8中,或者可能已经是10.7)如果按钮使用标准配置且不覆盖任何内容,则为NSButtons。它们使用一层作为挡板(其中间拉伸),另一个用于文本IIRC。这样,对于相同类型的所有按钮,只需将一个纹理上载到GPU。只有在NSButton中重写某些内容,苹果才会退回到实际使用NSCell的兼容模式。错误建议。这破坏了可访问性。而且UILabel实际上比NSTextField.NSTe更复杂xtField使用一个共享字段编辑器(NSTextView)对于同一窗口中的所有实例。直到最近,UILabel实际上还用于创建整个WebView以执行其文本绘制。最好的解决方案是将NSButtonCell子类化,并重写其-drawBezelWithFrame:inView:方法以绘制自己的按钮边框。您是否将UILabel与UIExtField混淆?UILabel从未使用过UIWebViews、 这对性能来说是非常糟糕的。至于可访问性部分,它仍然可以在NSButtonCell上手动实现。