【问题标题】:layout constraint is constraning everything布局约束约束一切
【发布时间】:2014-10-26 03:55:31
【问题描述】:

我正在尝试使用 NSScrollView + NSClipView 将子类 NSView 限制为实时调整大小。但是,即使窗口变小,子类 NSView 也需要具有最小尺寸。我已经实现了以下代码来执行此操作,它可以工作,除了它限制窗口的大小小于设置的最小值。我已经阅读了 Apple 的文献并搜索了通常的网络出没,以查找有关为什么此代码限制一切无济于事的信息。我已将必需的 - (BOOL)translatesAutoresizingMaskIntoConstraints {return NO;} 添加到子类 NSView。谁能建议为什么会发生这种情况,或者我可以在哪里了解更多关于这些视图如何与 NSLayoutConstraint 交互的信息。我受阻了。代码如下:

设置约束的代码是:

  • (void)applicationDidFinishLaunching:(NSNotification *)aNotification {

....

NSRect windowFrame = NSScreen.mainScreen.visibleFrame;
windowFrame.size.width = pageSize.width+80;
[_window setFrame:windowFrame display:NO];

canvas = [[PVDCanvasView alloc] init];
[scrollView setDocumentView:canvas];

[scrollView addConstraint:
 [NSLayoutConstraint constraintWithItem:canvas // sets left side of canvas
                              attribute:NSLayoutAttributeLeft
                              relatedBy:NSLayoutRelationEqual
                                 toItem:scrollView
                              attribute:NSLayoutAttributeLeft
                             multiplier:1
                               constant:0]];

[scrollView addConstraint:
 [NSLayoutConstraint constraintWithItem:canvas // sets top of canvas
                              attribute:NSLayoutAttributeTop
                              relatedBy:NSLayoutRelationEqual
                                 toItem:scrollView
                              attribute:NSLayoutAttributeTop
                             multiplier:1
                               constant:0]];

[scrollView addConstraint:
 [NSLayoutConstraint constraintWithItem:canvas // sets canvas width to width of scroll view
                              attribute:NSLayoutAttributeWidth
                              relatedBy:NSLayoutRelationEqual
                                 toItem:scrollView
                              attribute:NSLayoutAttributeWidth
                             multiplier:1
                               constant:0]];

[canvas addConstraint:
 [NSLayoutConstraint constraintWithItem:canvas // sets minimum canvas width
                              attribute:NSLayoutAttributeWidth
                              relatedBy:NSLayoutRelationGreaterThanOrEqual
                                 toItem:nil
                              attribute:NSLayoutAttributeNotAnAttribute
                             multiplier:1
                               constant:pageSize.width+40]];

[canvas addConstraint:
 [NSLayoutConstraint constraintWithItem:canvas // sets initial height
                              attribute:NSLayoutAttributeHeight
                              relatedBy:NSLayoutRelationEqual
                                 toItem:nil
                              attribute:NSLayoutAttributeNotAnAttribute
                             multiplier:1
                               constant:pageSize.height+40]];

}

【问题讨论】:

    标签: macos cocoa nslayoutconstraint


    【解决方案1】:

    如果您希望阻止窗口调整大小的约束,则需要将这些约束的优先级设置为小于NSLayoutPriorityWindowSizeStayPut。可能他们应该在NSLayoutPriorityDefaultLow

    在您的情况下,这就是将您的canvasscrollView 相关联的约束,或者至少是宽度之一。在将约束添加到视图之前,您需要设置这些优先级。

    顺便说一句,我不确定将画布限制为滚动视图是否有效。我认为您可能需要将其限制为滚动视图的剪辑视图(即其contentView)。

    【讨论】:

    • 实际上我使用被引用为 scrollView.contentView 和作为 canvas.superview 的剪辑视图尝试了这个。这些更改仍然产生相同的行为。我还尝试将宽度约束的优先级降低到 NSLayoutPriorityDefaultHigh 的想法,这会使优先级相对于最小宽度约束更低。那也不起作用。但是,当我接受您的建议并将优先级更改为 NSLayoutPriorityDefaultLow 时,它就像一个魅力。谢谢你的建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-12
    • 2022-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-29
    • 1970-01-01
    相关资源
    最近更新 更多