【问题标题】:Prevent breaking constraint on collapsable NSSplitView防止打破对可折叠 NSSplitView 的约束
【发布时间】:2018-07-09 11:18:50
【问题描述】:

我有一个包含 NSSearchField 的 NSSplitView。它看起来像这样:

我使用以下代码创建了 NSSearchField:

- (void) applicationDidFinishLaunching: (NSNotification *) aNotification
{
    searchField = [[NSSearchField alloc] init];
    searchField.translatesAutoresizingMaskIntoConstraints = NO;
    [leftView addSubview: searchField];
    [searchField.leadingAnchor constraintEqualToAnchor: leftView.leadingAnchor
                                              constant: 1.0f].active = YES;
    [searchField.trailingAnchor constraintEqualToAnchor: leftView.trailingAnchor
                                               constant: -1.0f].active = YES;
    [searchField.topAnchor constraintEqualToAnchor: leftView.topAnchor
                                          constant: 1.0f].active = YES;
    [searchField.heightAnchor constraintEqualToConstant: 22.0f].active = YES;
}

这很好用,我可以毫无问题地调整拆分器的大小。

但是,如果我添加以下 NSSplitViewDelegate 方法(尝试使左侧完全可折叠):

- (CGFloat)splitView:(NSSplitView *)splitView
constrainMinCoordinate:(CGFloat)proposedMinimumPosition
         ofSubviewAt:(NSInteger)dividerIndex
{
    if(0 == dividerIndex)
    {
        return 0;
    }

    return proposedMinimumPosition;
}

现在,如果我调整拆分器的大小以使左视图折叠,则会违反约束。

AnchorTest[57668:1656122] [Layout] Unable to simultaneously satisfy constraints:
(
    "<NSAutoresizingMaskLayoutConstraint:0x604000084c40 h=--& v=--& NSView:0x60c000120b40.width == 0.5   (active)>",
    "<NSLayoutConstraint:0x60c0000822b0 H:|-(1)-[NSSearchField:0x100412290]   (active, names: '|':NSView:0x60c000120b40 )>",
    "<NSLayoutConstraint:0x60c000085f50 NSSearchField:0x100412290.trailing == NSView:0x60c000120b40.trailing   (active)>"
)

这是有道理的。显然搜索字段前导/尾随锚点不能偏移 -1,如果我删除偏移量,约束就没有问题。

问题是我想要左/右偏移。必须有办法通过 AutoLayout 做到这一点,但我无法弄清楚。有谁知道如何正确地做到这一点?

【问题讨论】:

    标签: objective-c macos autolayout nsview nssplitview


    【解决方案1】:

    将分隔线拖到末尾与折叠不同。从constrainMinCoordinate 返回最小可用大小并实现splitView:canCollapseSubview:

    【讨论】:

    • 啊,我的错误是我正在处理 splitView:canCollapseSubview:(它的文档提到你需要首先实现 constrainMinCoordinate。我只是假设 canCollapseSubviews 会有同样的问题。我能够让一切正常工作你是怎么提到的。
    猜你喜欢
    • 1970-01-01
    • 2019-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-20
    相关资源
    最近更新 更多