Как поместить заголовок раскрывающего треугольника справа от треугольника? - PullRequest
2 голосов
/ 20 января 2011

В примере HIG о том, как использовать раскрывающие треугольники, он показывает метку прямо справа от треугольника.

Однако, когда я выбрасываю один из них на мой вид в Интерфейсном Разработчике, текст центрируется поверх треугольника. Я искал документы API NSButton и ткнул все, что могу найти в IB, но ничего из того, что я попробую, не поместит текст справа от треугольника. Чего мне не хватает?

Ответы [ 3 ]

10 голосов
/ 20 января 2011

Обычно я использую 2 кнопки: одну кнопку раскрытия и другую кнопку для метки:

alt text

Хотя вы можете использовать текстовое поле для метки, я предпочитаюиспользуя кнопку и установив кнопку для вызова performClick: в раскрывающемся треугольнике.Это позволяет гораздо большей целевой области иметь возможность щелкать, чем маленький треугольник.(Пользователи с трекпадами будут вам благодарны.)

Чтобы настроить кнопку, измените ее так, чтобы она выглядела следующим образом:

alt text

Затем установите ее действие:

alt text

Я не уверен, есть ли реальный способ заставить кнопку правильно отображать обе кнопки (я имею в виду, не имея подклассов), поскольку я обычно использовал отдельные элементы дляЭффект.(Я только что проверил, и действительно есть элемент управления раскрытием Carbon, который имеет и треугольник, и встроенную метку).

Элемент управления Carbon имеет правильную идею, когда нажатие на метку автоматически активирует элемент управления.В некоторых местах (особенно переписанный Cocoa Finder) вы можете видеть, что вы не получаете такое поведение бесплатно (если вы не используете кнопку, как я показал).У меня все еще есть открытая ошибка (rdar: // 6828042): BugID 6828042: 10.6 (10A335) Finder: Disclsr инспектора.текстовая метка треугольника не переключается".; -)

1 голос
/ 20 января 2011

Вы пробовали просто использовать треугольник и использовать отдельную метку?

0 голосов
/ 01 марта 2016

Виджет раскрытия треугольника нарисован рамкой кнопки в центре доступного пространства.Чтобы создать треугольную кнопку раскрытия, которая также имеет заголовок, вам просто нужно создать подкласс 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

И в Swift:

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)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...