Интерфейсный конструктор сегментированных элементов управления? - PullRequest
2 голосов
/ 24 августа 2009

Я создаю панель инструментов, которую я хочу, чтобы она выглядела как-то похожа на Preview. Я хочу создать кнопки «Предыдущая / Следующая». Я думаю, это сделано с помощью сегментированного элемента управления, каждый из которых имеет изображение в элементе управления. Проблема в том, что я не могу понять, как получить ярлыки внизу. Я могу разместить ОДНУ метку в центре всего этого, но пометить сегментированный элемент управления, но я не могу получить метки Next и Previous под каждой частью элемента управления.

Что мне здесь не хватает?

спасибо.

Ответы [ 3 ]

1 голос
/ 04 сентября 2009

Брайан, вы, возможно, не видели мой n-й комментарий (sic) к моему первоначальному ответу (поскольку переполнение стека скрывает их в сворачиваемом разделе, когда их слишком много). Но мой последний комментарий ответил на ваш последний вопрос (т. Е. Тот, что вы неспособны создать NSToolbarItemGroup из Interface Builder).

Теперь, когда выпущен Snow Leopard, я могу сказать, что вы все еще не можете графически решить вашу проблему, перетаскивая некоторый элемент управления из палитры этого нового IB. Нет, ваше единственное решение - IMHO, как указано в моем комментарии от 27 августа, «программно распределять, инициализировать и настраивать вашу группу перед добавлением ее в ваш экземпляр панели инструментов».

Я надеюсь, что вы увидите этот новый ответ (потому что я думаю, вы просто не заметили мой скрытый комментарий ...). Желаю вам удачи, надеюсь, что вы сможете решить вашу проблему с помощью этих подсказок, а необходимый код все еще находится в разделе Overview справочника класса NSToolbarItemGroup.

1 голос
/ 14 июня 2016

Как отметил @ frédéric-blanc: единственный способ достичь этого - программно NSToolbarItemGroup.

Хитрость заключается в назначении массива view и subitems для NSToolbarItemGroup.

let group = NSToolbarItemGroup(itemIdentifier: "NavigationGroupToolbarItem")

let itemA = NSToolbarItem(itemIdentifier: "PrevToolbarItem")
itemA.label = "Prev"
let itemB = NSToolbarItem(itemIdentifier: "NextToolbarItem")
itemB.label = "Next"

let segmented = NSSegmentedControl(frame: NSRect(x: 0, y: 0, width: 85, height: 40))
segmented.segmentStyle = .TexturedRounded
segmented.trackingMode = .Momentary
segmented.segmentCount = 2
// Don't set a label: these would appear inside the button
segmented.setImage(NSImage(named: NSImageNameGoLeftTemplate)!, forSegment: 0)
segmented.setWidth(40, forSegment: 0)
segmented.setImage(NSImage(named: NSImageNameGoRightTemplate)!, forSegment: 1)
segmented.setWidth(40, forSegment: 1)

// `group.label` would overwrite segment labels
group.paletteLabel = "Navigation"
group.subitems = [itemA, itemB]
group.view = segmented

Если вы хотите побаловаться, см. Пример кода приложения ниже.

Пример приложения

Sample window

Это все, что вам нужно для нового образца приложения OS X / Cocoa: перезаписать AppDelegate.swift следующими строками кода:

import Cocoa

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate, NSToolbarDelegate {

    @IBOutlet weak var window: NSWindow!

    var toolbar: NSToolbar!

    let toolbarItems: [[String: String]] = [
        ["title" : "irrelevant :)", "icon": "NSPreferencesGeneral", "identifier": "NavigationGroupToolbarItem"],
        ["title" : "Share", "icon": NSImageNameShareTemplate, "identifier": "ShareToolbarItem"],
        ["title" : "Add", "icon": NSImageNameAddTemplate, "identifier": "AddToolbarItem"]
    ]

    var toolbarTabsIdentifiers: [String] {

        return toolbarItems.flatMap { $0["identifier"] }
    }

    func applicationDidFinishLaunching(aNotification: NSNotification) {

        toolbar = NSToolbar(identifier: "TheToolbarIdentifier")
        toolbar.allowsUserCustomization = true
        toolbar.delegate = self
        self.window?.toolbar = toolbar
    }

    func toolbar(toolbar: NSToolbar, itemForItemIdentifier itemIdentifier: String, willBeInsertedIntoToolbar flag: Bool) -> NSToolbarItem? {

        guard let infoDictionary: [String : String] = toolbarItems.filter({ $0["identifier"] == itemIdentifier }).first
            else { return nil }

        let toolbarItem: NSToolbarItem

        if itemIdentifier == "NavigationGroupToolbarItem" {

            let group = NSToolbarItemGroup(itemIdentifier: itemIdentifier)

            let itemA = NSToolbarItem(itemIdentifier: "PrevToolbarItem")
            itemA.label = "Prev"
            let itemB = NSToolbarItem(itemIdentifier: "NextToolbarItem")
            itemB.label = "Next"

            let segmented = NSSegmentedControl(frame: NSRect(x: 0, y: 0, width: 85, height: 40))
            segmented.segmentStyle = .TexturedRounded
            segmented.trackingMode = .Momentary
            segmented.segmentCount = 2
            // Don't set a label: these would appear inside the button
            segmented.setImage(NSImage(named: NSImageNameGoLeftTemplate)!, forSegment: 0)
            segmented.setWidth(40, forSegment: 0)
            segmented.setImage(NSImage(named: NSImageNameGoRightTemplate)!, forSegment: 1)
            segmented.setWidth(40, forSegment: 1)

            // `group.label` would overwrite segment labels
            group.paletteLabel = "Navigation"
            group.subitems = [itemA, itemB]
            group.view = segmented

            toolbarItem = group
        } else {
            toolbarItem = NSToolbarItem(itemIdentifier: itemIdentifier)
            toolbarItem.label = infoDictionary["title"]!

            let iconImage = NSImage(named: infoDictionary["icon"]!)
            let button = NSButton(frame: NSRect(x: 0, y: 0, width: 40, height: 40))
            button.title = ""
            button.image = iconImage
            button.bezelStyle = .TexturedRoundedBezelStyle
            toolbarItem.view = button
        }

        return toolbarItem
    }

    func toolbarDefaultItemIdentifiers(toolbar: NSToolbar) -> [String] {

        return self.toolbarTabsIdentifiers;
    }

    func toolbarAllowedItemIdentifiers(toolbar: NSToolbar) -> [String] {

        return self.toolbarDefaultItemIdentifiers(toolbar)
    }

    func toolbarSelectableItemIdentifiers(toolbar: NSToolbar) -> [String] {

        return self.toolbarDefaultItemIdentifiers(toolbar)
    }

    func toolbarWillAddItem(notification: NSNotification) {

        print("toolbarWillAddItem", (notification.userInfo?["item"] as? NSToolbarItem)?.itemIdentifier ?? "")
    }

    func toolbarDidRemoveItem(notification: NSNotification) {

        print("toolbarDidRemoveItem", (notification.userInfo?["item"] as? NSToolbarItem)?.itemIdentifier ?? "")

    }

    func applicationWillTerminate(aNotification: NSNotification) {
        // Insert code here to tear down your application
    }

}
1 голос
/ 26 августа 2009

Я почти уверен, что это "хак" ... В Интерфейсном Разработчике (IB) мне удалось воссоздать вид, который вы хотели бы достичь, используя, как уже упоминалось, экземпляр NSSegmentedControl с "Капсулой" стиль. Но для его метки я думаю, что это «просто» строка «Предыдущая Следующая»… (Да, с некоторыми пробелами в качестве разделителей :(!)

РЕДАКТИРОВАТЬ: Правильный ответ можно найти в комментариях; то есть из Leopard, можно использовать класс NSToolbarItemGroup для достижения такого результата с помощью сегментированного элемента панели управления, как показано в коде документации здесь .

(Извините за путаницу, но, поскольку я новичок в Stack Overflow, я не знаю, лучше ли удалять мои комментарии - и редактировать мой ответ - или оставлять их для целей истории ...)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...