gpt4 book ai didi

objective-c - 自定义 NSWindow 内容边距会导致自动调整大小蒙版困惑

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

我目前正在使用 this 中所示的方法Cocoa with Love 文章创建自定义 NSWindow 子类。如示例中所示,我需要在窗口内容周围有大约 10 像素的边距才能绘制箭头(我正在创建一个弹出窗口样式窗口)。我必须在整个窗口周围设置边距,而不仅仅是带有箭头的一侧,因为我希望能够更改箭头位置,而不必重新定位内容。

总而言之,我用来执行此操作的方法是(相关代码位于底部):

  • 重写 NSWindow 的 contentRectForFrameRect:frameRectForContentRect:styleMask: 方法以在内容周围添加填充:
  • 将窗口的自定义绘制框架 View 设置为 contentView,然后重写 contentView 的 setter 和 getter,以便将传入的 View 添加为框架 View 的 subview

问题在于窗口的实际内容 View 内部的 View 的自动调整大小 mask 完全困惑。以下是我在界面生成器中设置内容的方法:

Layout

以下是如何设置 TableView ScrollView 的自动调整大小掩码:

Table View Autoresizing

以下是文本标签的自动调整大小蒙版的设置方式:

Label Autoresizing

这是应用内的结果:

Actual result

相关代码(源自上述文章)

#define CONTENT_MARGIN 10.0

- (NSRect)contentRectForFrameRect:(NSRect)windowFrame
{
windowFrame.origin = NSZeroPoint;
return NSInsetRect(windowFrame, CONTENT_MARGIN, ICONTENT_MARGIN);
}

- (NSRect)frameRectForContentRect:(NSRect)contentRect
{
return NSInsetRect(contentRect, -CONTENT_MARGINT, -CONTENT_MARGIN);
}

+ (NSRect)frameRectForContentRect:(NSRect)contentRect
styleMask:(NSUInteger)windowStyle
{
return NSInsetRect(contentRect, -CONTENT_MARGIN, -CONTENT_MARGIN);
}


- (NSView*)contentView
{
return _popoverContentView;
}

- (void)setContentView:(NSView *)aView
{
if ([_popoverContentView isEqualTo:aView]) { return; }
NSRect bounds = [self frame];
bounds.origin = NSZeroPoint;
SearchPopoverWindowFrame *frameView = [super contentView];
if (!frameView) {
frameView = [[[SearchPopoverWindowFrame alloc] initWithFrame:bounds] autorelease];
[super setContentView:frameView];
}
if (_popoverContentView) {
[_popoverContentView removeFromSuperview];
}
_popoverContentView = aView;
[_popoverContentView setFrame:[self contentRectForFrameRect:bounds]];
[_popoverContentView setAutoresizingMask:(NSViewWidthSizable | NSViewHeightSizable)];
[frameView addSubview:_popoverContentView];
}

我认为弹出窗口内容可能会超出边缘,所以我在内容 View 周围画了一个边框,但不,一切都应该是这样。唯一的问题是内容 View 内标签和 TableView 的自动调整大小蒙版无法正常工作。非常感谢任何建议。

编辑:如果有人感兴趣,我已在 github 上开源了此弹出窗口/ Controller 的完整代码:INPopoverController 。包含一个示例项目,以防您想尝试重现该问题。

最佳答案

-( void )scaleWindowForHeight:( float )height
{
if (height > 22)
{
NSWindow* window = [self window];
NSRect old_window_frame = [window frame];
NSRect old_content_rect = [window contentRectForFrameRect: old_window_frame];
NSSize new_content_size = NSMakeSize( old_window_frame.size.width, height );
// need to move window by Y-axis because NSWindow origin point is at lower side:
NSRect new_content_rect = NSMakeRect( NSMinX( old_content_rect ), NSMaxY( old_content_rect ) - new_content_size.height, new_content_size.width, new_content_size.height );
NSRect new_window_frame = [window frameRectForContentRect: new_content_rect];
[window setFrame: new_window_frame display:YES animate: [window isVisible] ];
}
else
NSLog(@"window size too small");
}

关于objective-c - 自定义 NSWindow 内容边距会导致自动调整大小蒙版困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5215219/

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