简体   繁体   English

Touch Bar,如何添加可滚动的按钮列表?

[英]Touch Bar, how to add a scrollable list of buttons?

I'd like to show a scrollable list of buttons in my app's Touch Bar, similar to how Safari shows favourites when typing an address.我想在我的应用程序的触控栏中显示一个可滚动的按钮列表,类似于 Safari 在键入地址时显示收藏夹的方式。

A scroll view doesn't seem to be one of the standard TouchBar controls.滚动视图似乎不是标准的 TouchBar 控件之一。 Which controls do you use for this?您为此使用哪些控件?

NSScrollView is actually supported on the TouchBar (https://developer.apple.com/reference/appkit/nstouchbar#2587738 ). TouchBar实际上支持 NSScrollView(https://developer.apple.com/reference/appkit/nstouchbar#2587738 )。

NSScrubber is intended to be a picker of items, similar to a segmented control but with the added benefit of a scrollable list. NSScrubber 旨在成为项目的选择器,类似于分段控件,但具有可滚动列表的额外好处。 NSScrubber also manages it's own highlighted state and will eat up touch events. NSScrubber 还管理它自己的高亮状态并且会吃掉触摸事件。 You can get a horizontal scrollable list of NSButtons by popping them into a scroll view.您可以通过将它们弹出到滚动视图中来获得 NSButton 的水平可滚动列表。 Here's a quick example using constraints to create an NSCustomTouchBarItem:下面是一个使用约束创建 NSCustomTouchBarItem 的简单示例:

  NSScrollView *scrollView = [[NSScrollView alloc] initWithFrame:CGRectMake(0, 0, 400, 30)];

  NSMutableDictionary *constraintViews = [NSMutableDictionary dictionary];
  NSView *documentView = [[NSView alloc] initWithFrame:NSZeroRect];

  NSString *layoutFormat = @"H:|-8-";
  NSSize size = NSMakeSize(8, 30);

  for (int i = 0; i <= 8; i++) {
    NSString *objectName = [NSString stringWithFormat:@"button%@",@(i)];
    NSButton *button = [NSButton buttonWithTitle:objectName
                                          target:nil
                                          action:nil];
    button.translatesAutoresizingMaskIntoConstraints = NO;
    [documentView addSubview:button];

    // Constraint information
    layoutFormat = [layoutFormat stringByAppendingString:[NSString stringWithFormat:@"[%@]-8-", objectName]];
    [constraintViews setObject:button forKey:objectName];
    size.width += 8 + button.intrinsicContentSize.width;
  }

  layoutFormat = [layoutFormat stringByAppendingString:[NSString stringWithFormat:@"|"]];

  NSArray *hConstraints = [NSLayoutConstraint constraintsWithVisualFormat:layoutFormat
                                                                  options:NSLayoutFormatAlignAllCenterY
                                                                  metrics:nil
                                                                    views:constraintViews];

  [documentView setFrame:NSMakeRect(0, 0, size.width, size.height)];
  [NSLayoutConstraint activateConstraints:hConstraints];
  scrollView.documentView = documentView;

  NSCustomTouchBarItem *item = [[NSCustomTouchBarItem alloc] initWithIdentifier:@"com.TouchBar.scrollButtons"];
  item.view = scrollView;

As you probably know, you add NSTouchBarItem s to a TouchBar instance in order to add items to a Touch Bar.您可能知道,您将NSTouchBarItem添加到TouchBar实例以将项目添加到 Touch Bar。

In order to add a scrollable list, create an instance of NSScrubber .为了添加一个可滚动列表,创建一个NSScrubber的实例。 Once that's set up, you'll need to add that NSScrubber to a custom instance of NSCustomTouchBarItem , most likely to the view property.设置完成后,您需要将该NSCustomTouchBarItem添加到NSScrubber的自定义实例中,最有可能添加到view属性中。 Then, you can add that item to the Touch Bar.然后,您可以将该项目添加到触控栏。 Be sure to read the linked documentation.请务必阅读链接的文档。

I just translated the code from Santiago Gil to Swift 4.我刚刚将代码从 Santiago Gil 翻译成 Swift 4。

let scrollView = NSScrollView(frame: CGRect(x: 0, y: 0, width: 400, height: 30))
var constraintViews: Dictionary<String, Any> = [:]
let documentView = NSView(frame: NSZeroRect)

var layoutFormat: String = "H:|-8-"
var size = NSSize(width: 8, height: 30)

for i in 0...8 {
    let objectName: String = "button\(i)"
    let button: NSButton = NSButton(title: objectName, target: nil, action: nil)
    button.translatesAutoresizingMaskIntoConstraints = false
    
    documentView.addSubview(button)
    
    // Constraint Information
    
    layoutFormat += "[\(objectName)]-8-"
    constraintViews[objectName] = button
    size.width += 8 + button.intrinsicContentSize.width
     
}

layoutFormat += "|"

let hConstraints: Array<NSLayoutConstraint> = NSLayoutConstraint.constraints(withVisualFormat: layoutFormat, options: .alignAllCenterY, metrics: nil, views: constraintViews)

documentView.frame = NSRect(x: 0, y: 0, width: size.width, height: size.height)
NSLayoutConstraint.activate(hConstraints)

scrollView.documentView = documentView

let item = NSCustomTouchBarItem(identifier: .controlScrubber)

item.view = scrollView

Hopefully this helps someone;-)希望这对某人有帮助;-)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM