gpt4 book ai didi

cocoa - 在 10.9 及更高版本中如何让 NSScrollView 将文档 View 居中?

转载 作者:行者123 更新时间:2023-12-03 16:02:30 25 4
gpt4 key购买 nike

有很多关于如何让 NSScrollView 居中其文档 View 的示例。这是两个例子(它们是如此相似,以至于有人在没有注明出处的情况下复制某人,但关键在于如何复制。) http://www.bergdesign.com/developer/index_files/88a764e343ce7190c4372d1425b3b6a3-0.html https://github.com/devosoft/avida/blob/master/apps/viewer-macos/src/main/CenteringClipView.h

这通常是通过子类化 NSClipView 并覆盖来完成的:

- (NSPoint)constrainScrollPoint:(NSPoint)newOrigin;

但此方法在 Mac OS X 10.9 + 中已弃用

现在我们能做什么?哦不~!

最佳答案

嗯,答案很简单,而且远没有那么夸张。无论如何,这些都不适用于双击放大。

确实如此。它就是有效的。您还可以根据需要进行自定义调整。

@implementation中,您只需要实现constrainBoundsRect:的覆盖:

- (NSRect)constrainBoundsRect:(NSRect)proposedClipViewBoundsRect {

NSRect constrainedClipViewBoundsRect = [super constrainBoundsRect:proposedClipViewBoundsRect];

// Early out if you want to use the default NSClipView behavior.
if (self.centersDocumentView == NO) {
return constrainedClipViewBoundsRect;
}

NSRect documentViewFrameRect = [self.documentView frame];

// If proposed clip view bounds width is greater than document view frame width, center it horizontally.
if (proposedClipViewBoundsRect.size.width >= documentViewFrameRect.size.width) {
// Adjust the proposed origin.x
constrainedClipViewBoundsRect.origin.x = centeredCoordinateUnitWithProposedContentViewBoundsDimensionAndDocumentViewFrameDimension(proposedClipViewBoundsRect.size.width, documentViewFrameRect.size.width);
}

// If proposed clip view bounds is hight is greater than document view frame height, center it vertically.
if (proposedClipViewBoundsRect.size.height >= documentViewFrameRect.size.height) {

// Adjust the proposed origin.y
constrainedClipViewBoundsRect.origin.y = centeredCoordinateUnitWithProposedContentViewBoundsDimensionAndDocumentViewFrameDimension(proposedClipViewBoundsRect.size.height, documentViewFrameRect.size.height);
}

return constrainedClipViewBoundsRect;
}


CGFloat centeredCoordinateUnitWithProposedContentViewBoundsDimensionAndDocumentViewFrameDimension
(CGFloat proposedContentViewBoundsDimension,
CGFloat documentViewFrameDimension )
{
CGFloat result = floor( (proposedContentViewBoundsDimension - documentViewFrameDimension) / -2.0F );
return result;
}

在@interface 中只需添加一个属性。这允许您不使用居中。正如您可以想象的那样,有时您可能想要关闭居中的条件逻辑。

@property BOOL centerDocumentView;

此外,请务必在覆盖中将此 BOOL 设置为 YESNO

initWithFrameinitWithCoder:

因此您将有一个已知的默认值可供使用。

(记住 children , initWithCoder: 允许您执行必要的操作并在 nib 中设置 View 的类。不要忘记在之前调用 super你的东西!)

当然,如果您需要支持 10.9 之前的任何版本,您将需要实现其他内容。

(尽管可能没有其他人那么多......)

编辑:正如其他人所指出的,Apple 在 Swift 中有示例代码(尽管是 2016 年的,所以它可能不是当前的 Swift :D),地址为 https://developer.apple.com/library/archive/samplecode/Exhibition/Listings/Exhibition_CenteringClipView_swift.html

关于cocoa - 在 10.9 及更高版本中如何让 NSScrollView 将文档 View 居中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22072105/

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