如何以编程方式展开和折叠 NSSplitView 的部分内容?
-
06-09-2019 - |
题
我想更换 RBSplitView
和 NSSplitView
在我现有的项目中。该应用程序现在仅适用于 Leopard,我想替换 RBSplitView
与 新的 NSSplitView
与 Leopard 一起发货。
然而我却失踪了 RBSplitView
的便捷方法 expand
和 collapse
在 NSSplitView
. 。如何以编程方式展开和折叠 NSSplitView 的部分内容?
解决方案
我刚刚程序扩展和NSSplitView
塌陷工作。我也配置了我NSSplitView
展开/折叠子视图每当分频器是双击,所以我想这对发挥好与该功能(它似乎)。这是我做过什么:
(在这个例子中,splitView
是NSSplitView
本身,splitViewSubViewLeft
是我想展开/折叠和lastSplitViewSubViewLeftWidth
子视图的类型CGFloat
的一个实例变量。)
// subscribe to splitView's notification of subviews resizing
// (I do this in -(void)awakeFromNib)
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(mainSplitViewWillResizeSubviewsHandler:)
name:NSSplitViewWillResizeSubviewsNotification
object:splitView
];
// this is the handler the above snippet refers to
- (void) mainSplitViewWillResizeSubviewsHandler:(id)object
{
lastSplitViewSubViewLeftWidth = [splitViewSubViewLeft frame].size.width;
}
// wire this to the UI control you wish to use to toggle the
// expanded/collapsed state of splitViewSubViewLeft
- (IBAction) toggleLeftSubView:(id)sender
{
[splitView adjustSubviews];
if ([splitView isSubviewCollapsed:splitViewSubViewLeft])
[splitView
setPosition:lastSplitViewSubViewLeftWidth
ofDividerAtIndex:0
];
else
[splitView
setPosition:[splitView minPossiblePositionOfDividerAtIndex:0]
ofDividerAtIndex:0
];
}
其他提示
只要隐藏要折叠子视图,e.g。
[aSubViewToCollapse setHidden:YES];
您可能还需要实现委托方法 - (BOOL)SPLITVIEW:shouldHideDividerAtIndex:返回YES躲倒塌时分频器
我试图在溶液上方,并发现它没有工作,如isSubviewCollapsed未曾返回YES
的建议组合产生其中工程
的结果if ([splitViewTop isHidden]) {
[splitViewTop setHidden:NO];
[split
setPosition:previousSplitViewHeight
ofDividerAtIndex:0];
}
else {
[splitViewTop setHidden:YES];
}
[split adjustSubviews];
在与建议一些尝试,这是我发现的最简单的解决方案:
-(void)toggleCollapsibleView:(ib)sender {
[collapsibleView setHidden:![splitView isSubviewCollapsed:collapsibleView]];
[splitView adjustSubviews];
}
的功能是一个用户定义的第一响应者的行动。它是由一个菜单项(或键盘)触发。 该collapsibleView在SPLITVIEW两者都连接在IB与他们的特性的子视图。
在埃尔卡皮坦,这并获得成功我。
splitViewItem.collapsed = YES;
NSSplitView
实际上有一个 私有方法 -(void)_setSubview:(NSView *)view isCollapsed:(BOOL)collapsed
就是这样做的。那些想忽略所有反对使用私有方法的警告的人,请看:
- (void)toggleSubview:(NSView *)view {
SEL selector = @selector(_setSubview:isCollapsed:);
NSMethodSignature *signature = [NSSplitView instanceMethodSignatureForSelector:selector];
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
invocation.target = self;
invocation.selector = selector;
[invocation setArgument:&view atIndex:2];
BOOL arg = ![self isSubviewCollapsed:view];
[invocation setArgument:&arg atIndex:3];
[invocation invoke];
}
我将其作为一个类别实现 NSSplitView
. 。唯一的问题是 Xcode 会发出警告 _setSubview:isCollapsed:
未公开...我不太确定如何解决这个问题。
埃尔卡皮坦更新
我已经有大约 2 年没有为 OS X 编写任何代码了,所以我无法验证这一点,但根据 柠檬莫霍 在下面的评论中, _setSubview:isCollapsed:
在 El Capitan 更名为 _setArrangedView:isCollapsed:
.
在MACOS塞拉利昂,所述collapsed
属性更改为isCollapsed
。是直截了当只需设置属性true
或false
。下面的代码是从我WindowController
,其中我有两个SplitViewItem
s。
@IBAction func toggleMap(_ sender: Any) {
if let splitViewController = contentViewController as? NSSplitViewController {
let splitViewItem = splitViewController.splitViewItems
if splitViewItem.first!.isCollapsed {
splitViewItem.first!.isCollapsed = false
} else if splitViewItem.last!.isCollapsed {
splitViewItem.last!.isCollapsed = false
} else {
if splitViewItem.first!.isCollapsed {
splitViewItem.first!.isCollapsed = false
}
splitViewItem.last!.isCollapsed = true
}
}
}
在迅速这工作
func togglePanel() {
let splitViewItem = self.mySplitView.arrangedSubviews
if mySplitView.isSubviewCollapsed(outline.view){
splitViewItem[0].hidden = false
} else {
splitViewItem[0].hidden = true
}
这IBAction为调用此方法, 大纲是自己的厦门国际银行的OutlineViewController,我们需要的观点,因此outline.view,保持它的简单,但希望你的想法
@IBAction func segmentAction(sender: NSSegmentedControl) {
splitVC?.togglePanel(sender.selectedSegment)
}
和
func togglePanel(segmentID: Int) {
let splitViewItem = self.mySplitView.arrangedSubviews
switch segmentID {
case segmentID:
if mySplitView.isSubviewCollapsed(splitViewItem[segmentID]) {
splitViewItem[segmentID].hidden = false
} else {
splitViewItem[segmentID].hidden = true
}
default:
break
}
}
和实施委托
func splitView(splitView: NSSplitView, shouldHideDividerAtIndex dividerIndex: Int) -> Bool {
return true
}
,并以10.11 你可能只用toggleSidebar操作方法。 如何切换NSSplitView的知名度子视图+隐藏面板分离器分压器? https://github.com/Dis3buted/SplitViewController
我建议使用NSSplitViewController
代替,和NSSplitViewItem.isCollapsed
控制它们。这只是工作。
let item: NSSplitViewItem = ...
item.isCollapsed = true
为了使这个正常工作,你必须与主要视图控制器配置拆分的UI组件。否则,它可以被打破。