Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c NSTextView重叠NSButton并使其不可拾取_Objective C_Macos_Cocoa_Nsbutton - Fatal编程技术网

Objective c NSTextView重叠NSButton并使其不可拾取

Objective c NSTextView重叠NSButton并使其不可拾取,objective-c,macos,cocoa,nsbutton,Objective C,Macos,Cocoa,Nsbutton,我正在创建一个自定义的NSButton,由于我正在使用渐变视图对其进行子视图查看,默认的textView将消失。为了在textView上也有自定义的样式,我创建了一个自定义样式,并对其进行了子视图 按钮现在看起来像: 这是完美的。 但当我点击它时,NSButtonCell不会触发高亮显示方法(只有在我点击textView外部时才触发)(底部和顶部的间距为5px) 我如何才能(就像在iOS的UIButton中添加自定义标签一样)保持整个按钮的可点击性 任何帮助都将不胜感激 Sjors那么您想要在

我正在创建一个自定义的NSButton,由于我正在使用渐变视图对其进行子视图查看,默认的textView将消失。为了在textView上也有自定义的样式,我创建了一个自定义样式,并对其进行了子视图

按钮现在看起来像:

这是完美的。 但当我点击它时,NSButtonCell不会触发高亮显示方法(只有在我点击textView外部时才触发)(底部和顶部的间距为5px)

我如何才能(就像在iOS的UIButton中添加自定义标签一样)保持整个按钮的可点击性

任何帮助都将不胜感激


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上手动实现。