在如何使用显示三角形的the HIG's example中,它直接在三角形的右侧显示标签。
但是,当我在Interface Builder中将其中一个抛出到我的视图中时,文本位于三角形的顶部。我搜索了NSButton API文档,并且搜索了我在IB中可以找到的所有内容,但我尝试的任何内容都不会将文本放在三角形的右侧。我错过了什么?
答案 0 :(得分:10)
我通常使用2个按钮:一个公开按钮和另一个标签按钮:
虽然您可以为标签使用文本字段,但我更喜欢使用按钮并设置按钮以在显示三角形上调用performClick:
。这使得能够点击比小三角形更大的目标区域。 (带触控板的用户会感谢你)。
要设置按钮,请将其更改为如下所示:
然后设置其动作:
我不确定是否有实际的方法让按钮正确显示(没有子类化我的意思),因为我通常只使用单独的项目来产生效果。 (我刚检查过,确实有一个Carbon公开控件,内置三角形和标签)。
Carbon控件有正确的想法,点击标签将自动触发控件。在某些地方(特别是重写的Cocoa Finder),你可以看到你没有免费获得这种行为(除非你使用像我所示的按钮)。我仍然有一个漏洞(rdar:// 6828042):BugID 6828042: 10.6(10A335)Finder:Inspector的内容。三角形的文字标签不可翻转“。; - )
答案 1 :(得分:1)
您是否尝试过使用三角形并使用单独的标签?
答案 2 :(得分:0)
显示三角形小部件由按钮的边框绘制,以可用空间为中心。要创建一个也有标题的显示三角形按钮,您只需要子类NSButtonCell
并确保将边框限制在按钮的左侧,并且标题避开了边框。然后在IB中添加按钮,展开它并设置标题,并设置单元格的类。遗憾的是,IB不知道如何显示子类,并将三角形放在按钮的中间。只要确保它足够大。
在Objective-C中:
@interface TitledDisclosureTriangleButtonCell : NSButtonCell
@end
#define TRIANGLE_PADDING 15.f
@implementation TitledDisclosureTriangleButtonCell
- (NSRect)titleRectForBounds:(NSRect)theRect
{
NSRect titleRect = [super titleRectForBounds:theRect];
titleRect.origin.x = TRIANGLE_PADDING;
titleRect.size.width = NSWidth(titleRect) - TRIANGLE_PADDING;
return titleRect;
}
- (void)drawBezelWithFrame:(NSRect)frame inView:(NSView *)controlView
{
NSRect bezelFrame = frame;
bezelFrame.size.width = TRIANGLE_PADDING;
[super drawBezelWithFrame:bezelFrame inView:controlView];
}
@end
在斯威夫特:
let TRIANGLE_PADDING: CGFloat = 15
class TitledDisclosureTriangleButtonCell: NSButtonCell
{
override func titleRectForBounds(theRect: NSRect) -> NSRect {
var titleRect = super.titleRectForBounds(theRect)
titleRect.origin.x = TRIANGLE_PADDING
titleRect.size.width = titleRect.size.width - TRIANGLE_PADDING
return titleRect
}
override func drawBezelWithFrame(frame: NSRect, inView controlView: NSView) {
var bezelFrame = frame
bezelFrame.size.width = TRIANGLE_PADDING
super.drawBezelWithFrame(bezelFrame, inView: controlView)
}
}