gpt4 book ai didi

macos - 移动嵌套 NSSplitView 的分割器使其向外生长

转载 作者:行者123 更新时间:2023-12-03 17:49:58 27 4
gpt4 key购买 nike

嵌套NSSplitView实例会导致奇怪的行为。当拖动嵌套 splitView 的拆分器时,父 splitView 的拆分器可以移动以容纳更大的子级,作为拖动的副作用。

这是一个重现此问题的极简项目的 URL。只需向右拖动最右侧的分离器,直到最左侧的分离器开始自行移动。 http://filebin.ca/20ymCpNmtts7/NestedSplitTest.zip

据我了解,问题的原因是,当拖动 splitView 的分割器时,添加了一个新的约束,将拖动的分割器左侧的 contentView 的右边缘绑定(bind)到 NSSplitView 的左边缘。本身。拖动完成后,此约束将被删除。当拖动正在进行时,分割器受到其他面板的最小宽度的约束,然后这个临时约束的常量值的总和超过了 Pane 可以调整大小的宽度,这使得 NSSplitView 本身变大,这反过来又调整了面板的大小最外面的分离器。

我尝试过使用 NSSplitViewDelegate约束分割位置,但由于临时约束,在 NSSplitView 已经增长之后调用此委托(delegate)方法。实现 constrainMinCoordinate 之一或constrainMaxCoordinate委托(delegate)方法使得NSSplitView完全忽略面板上配置的最小宽度。

另外,当拖动开始或结束时,我似乎无法通过通知或子类化 NSSplitView 获得正确的事件。 。 Hook 这两个事件将允许我添加临时约束以确保 NSSplitView 无法向外增长。甚至压倒一切mouseDown:mouseUp:不起作用,因为 mouseUp:拖拽结束后从未被叫过。

更新 1:我找到了原因的解释mouseUp:不被调用:这是因为分割器的拖动是使用在 NSEventTrackingRunLoopMode 中运行的嵌套 RunLoop 实现的。 。 mouseDragged:就是这样的和mouseUp:事件被无声地吞噬。这是相关文档:https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/EventOverview/HandlingMouseEvents/HandlingMouseEvents.html#//apple_ref/doc/uid/10000060i-CH6-SW4

最佳答案

理解为什么 mouseUp: 没有被调用是实现此问题解决方案的关键。这是一个自定义的 NSSplitView 子类,可防止拖动拆分器时 splitView 向外生长。

@interface NestableSplitView : NSSplitView

@property(strong) NSLayoutConstraint* temporaryWidthConstraint;

@end

@implementation NestableSplitView

- (void)mouseDown:(NSEvent *)theEvent
{
if (!self.temporaryWidthConstraint) {
self.temporaryWidthConstraint = [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1 constant:0];
}
self.temporaryWidthConstraint.constant = NSWidth(self.bounds);
[self addConstraint:self.temporaryWidthConstraint];
[super mouseDown:theEvent]; // This call is blocking until the drag is finished
[self removeConstraint:self.temporaryWidthConstraint];
}

@end

关于macos - 移动嵌套 NSSplitView 的分割器使其向外生长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30115690/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com