如何将三角形标题放在三角形的右边?

时间:2011-01-19 23:09:55

标签: cocoa interface-builder

在如何使用显示三角形的the HIG's example中,它直接在三角形的右侧显示标签。

但是,当我在Interface Builder中将其中一个抛出到我的视图中时,文本位于三角形的顶部。我搜索了NSButton API文档,并且搜索了我在IB中可以找到的所有内容,但我尝试的任何内容都不会将文本放在三角形的右侧。我错过了什么?

3 个答案:

答案 0 :(得分:10)

我通常使用2个按钮:一个公开按钮和另一个标签按钮:

alt text

虽然您可以为标签使用文本字段,但我更喜欢使用按钮并设置按钮以在显示三角形上调用performClick:。这使得能够点击比小三角形更大的目标区域。 (带触控板的用户会感谢你)。

要设置按钮,请将其更改为如下所示:

alt text

然后设置其动作:

alt text

我不确定是否有实际的方法让按钮正确显示(没有子类化我的意思),因为我通常只使用单独的项目来产生效果。 (我刚检查过,确实有一个Carbon公开控件,内置三角形和标签)。

Carbon控件有正确的想法,点击标签将自动触发控件。在某些地方(特别是重写的Cocoa Finder),你可以看到你没有免费获得这种行为(除非你使用像我所示的按钮)。我仍然有一个漏洞(rdar:// 6828042):BugID 6828042: 10.6(10A335)Finder:Inspector的内容。三角形的文字标签不可翻转“。; - )

答案 1 :(得分:1)

您是否尝试过使用三角形并使用单独的标签?

答案 2 :(得分:0)

显示三角形小部件由按钮的边框绘制,以可用空间为中心。要创建一个也有标题的显示三角形按钮,您只需要子类NSButtonCell并确保将边框限制在按钮的左侧,并且标题避开了边框。然后在IB中添加按钮,展开它并设置标题,并设置单元格的类。遗憾的是,IB不知道如何显示子类,并将三角形放在按钮的中间。只要确保它足够大。

The button will not look right in IB, but don't worry.

在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)
    }
}