我正在开发OS X的应用程序,我使用自定义窗口绘制图像作为背景,包括标题栏.我一直在修改这段代码来绘制窗口,然后调用[NSWindow standardWindowButton:forStyleMask:]来获得标准关闭,最小化和最大化按钮.
问题是我的应用程序使用NSPopovers,当我在弹出窗口打开时关闭或最小化应用程序时,它将关闭弹出窗口或显示弹出窗口的动画最小化而不是关闭应用程序.有没有办法覆盖NSWindow中的默认关闭/最小化行为,所以我可以先解除任何开放的弹出式窗口?
谢谢,对不起,如果这是一个显而易见的问题 - 这是我第一次使用OS X SDK,所以我没有很多经验.
编辑:我发布这几个小时之后,我认为我有一个明显的解决方案 - 使用NSWindowDelegate方法"windowWillClose:"和"windowWillMiniaturize:"并解雇那里的popovers.但是,似乎由于关闭/最小化按钮正在关闭弹出窗口,如果弹出窗口打开,则不会调用这些委托方法.这让我回到第1步,但希望知道这种行为会帮助别人找出问题所在.
NSPopovers还有另一个问题,我不知道它是否连接,所以我想我会在这里添加它,以防万一有共同的原因.有时候,当我试图解除一个popover时,我会得到这个错误(对于上下文,我正在按下一个NSButton,它调用一个检查popover存在的函数,如果它存在,则关闭它):
2011-08-30 11:24:08.949 Playground[11194:707] *** Assertion failure in +[NSView _findFirstKeyViewInDirection:forKeyLoopGroupingView:], /SourceCache/AppKit/AppKit-1138/AppKit.subproj/NSView.m:11026
2011-08-30 11:24:08.950 Playground[11194:707] this method is supposed to only be invoked on top level items
2011-08-30 11:24:08.958 Playground[11194:707] (
0 CoreFoundation 0x00007fff873d4986 __exceptionPreprocess + 198
1 libobjc.A.dylib 0x00007fff87ac6d5e objc_exception_throw + 43
2 CoreFoundation 0x00007fff873d47ba +[NSException raise:format:arguments:] + 106
3 Foundation 0x00007fff8950314f -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 169
4 AppKit 0x00007fff88211064 +[NSView _findFirstKeyViewInDirection:forKeyLoopGroupingView:] + 137
5 AppKit …Run Code Online (Sandbox Code Playgroud) 我正在开发一个由 TextKit 支持的多页阅读应用程序,该应用程序基于 WWDC 2013 的“Advanced Text Layouts and Effects with Text Kit”会议(但有些代码是根据不完整的示例重建的)。基本结构是预先计算文本所需的页面数,然后为每个页面创建一个 NSTextContainer 并将其添加到 NSLayoutManager 中。每当 UIPageViewController 请求下一页或上一页时,您都会创建一个新的 UITextView 并通过从 NLayoutManger 的 NSTextContainers 数组中选择正确的一个来设置其背景文本容器。
不幸的是,我遇到了一个问题,即文本在第一页上以及第一次翻回任何给定页面时都会重新排列。它看起来是这样的:

这不是最明显的效果(如果你错过了,请在回页时注意屏幕顶部),但它有点让人迷失方向,如果可能的话我想消除它。鉴于文本容器应该预先计算,我不明白为什么它要回流文本,或者如何防止它。有谁知道问题是什么?
编辑:添加代码示例。
@interface ReaderViewController () <UIPageViewControllerDataSource>
@property (nonatomic, assign) NSUInteger numberOfPages;
@property (nonatomic, retain) UIPageViewController *pageViewController;
@property (nonatomic, retain) NSTextStorage *currentDocument;
@property (nonatomic, retain) NSLayoutManager *layoutManager;
@end
@implementation ReaderViewController
- (instancetype)initWithDocument:(NSTextStorage *)document {
if ((self = [super init])) {
_currentDocument = document;
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
_layoutManager = …Run Code Online (Sandbox Code Playgroud)