代码之家  ›  专栏  ›  技术社区  ›  Thom Smith

使用类似XCode的图标按钮来控制侧栏中的选项卡视图

  •  0
  • Thom Smith  · 技术社区  · 3 年前

    enter image description here

    我试图创建一个类似于Xcode属性面板的选项卡式面板,但标准选项卡式面板的外观和感觉似乎有所不同,无法更改。应该使用哪些控件来创建外观类似的选项卡式面板?

    编辑: 我没有使用NSTabViewController,只是使用了TabView!!

    0 回复  |  直到 8 年前
        1
  •  6
  •   Peter Ahlberg    7 年前

    我刚刚创建了一个带有故事板和提供的布局的新项目,并将其添加到视图控制器视图顶部的自定义视图中。在自定义视图中添加了按钮,style=square,type=toggle,并使用提供的类型模板图标。将标签分配给按钮0-4,并将其放置在水平堆栈视图中。然后添加了一条水平线和一个容器视图。然后,我将选项卡视图控制器添加到情节提要中,并将其嵌入到容器视图中。所有按钮都连接到同一动作。

    import Cocoa
    
    class ViewController: NSViewController {
    
        @IBOutlet var myStackView: NSStackView!
    
        var oldSelection: Int = 0
        var newSelection: Int = 0
    
        var buttons: [NSButton]?
        var tabViewDelegate: NSTabViewController?
    
        @IBAction func selectedButton(_ sender: NSButton) {
            newSelection = sender.tag
            tabViewDelegate?.selectedTabViewItemIndex = newSelection
    
            buttons![oldSelection].state = .off
            sender.state = .on
    
            oldSelection = newSelection
        }
    
        override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view.
            buttons = (myStackView.arrangedSubviews as! [NSButton])
        }
    
        override var representedObject: Any? {
            didSet {
            // Update the view, if already loaded.
            }
        }
    
        override func prepare(for segue: NSStoryboardSegue, sender: Any?) {
            // Once on load
            tabViewDelegate = segue.destinationController as?  NSTabViewController
        }
    
    }
    
        2
  •  3
  •   Eugene Mankovski    8 年前

    如果使用故事板,只需将tab view controller拖动到曲面并连接到窗口。 然后转到tab view controller的IB设置,并将样式更改为工具栏,如下所示:

    enter image description here

    然后添加选项卡,并向每个选项卡添加图像,如下所示:

    enter image description here

    运行你的应用程序,享受“外观为XCode设置”视图:

    enter image description here

        3
  •  3
  •   Lausbert    4 年前

    迅捷

    实施

    struct SystemSegmentControl : View {
        
        // MARK: - Internal -
    
        @Binding var selection : Int
        let systemImages: [String]
    
        var body : some View {
            HStack(spacing: 5) {
                ForEach (0..<systemImages.count) { i in
                    SystemSegmentButton(selection: self.$selection, selectionIndex: i, systemImage: systemImages[i])
                  }
            }
        }
    }
    
    
    struct SystemSegmentButton : View {
        
        // MARK: - Internal -
    
        @Binding var selection : Int
        let selectionIndex: Int
        let systemImage : String
    
        var body : some View {
            Button(action: { self.selection = self.selectionIndex }) {
                Image(systemName: systemImage)
                    .padding(8)
                    .foregroundColor(selectionIndex == selection ? .controlAccentColor : .controlColor)
            }
            .buttonStyle(BorderlessButtonStyle())
        }
    }
    

    用法

    struct SettingsView: View {
        
        // MARK: - Internal -
                
        var body: some View {
            GeometryReader { geometry in
                VStack(spacing: 0) {
                    SystemSegmentControl(selection: $selection, systemImages: ["slider.horizontal.3", "eye"])
                    Divider()
                    switch selection {
                    case 0:
                        Text("Tab 1")
                    default:
                        Text("Tab 2")
                    }
                }
                .frame(width: geometry.size.width, height: geometry.size.height, alignment: .topLeading)
            }
            .frame(width: 250)
        }
        
        // MARK: - Private -
        
        @State private var selection = 0
    
    }
    

    后果

    enter image description here