objective-c - NSSplitView - 如何在 View 调整大小后收到通知?

标签 objective-c macos nssplitview

我需要知道任何 NSSplitView subview 的框架何时发生变化,但只有在它们完成调整大小之后。

目前我在 NSSplitView 子类中使用它:

[[NSNotificationCenter defaultCenter] addObserver: self
                                      selector: @selector(didResize:)
                                      name: NSSplitViewDidResizeSubviewsNotification
                                      object: self];

但我遇到的问题是,当 Split View正在调整大小或包含窗口更改其框架大小时,这会发送数百个通知。这会对性能产生很大的不利影响!

一旦分割 View 已经永久改变了框架,我怎么知道(不增加任何开销或困惑 - 一个计时器经常检查是否停止调整大小并不是我真正想要的解决方案)。

最佳答案

如果您不想对每个更改都做出响应,我认为您需要使用某种计时方法。我认为像这样的东西应该工作得很好。只要在 .1 秒内再次调用该方法,第一行就会取消第二行。

-(void)splitViewDidResizeSubviews:(NSNotification *)notification {
    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(respondToSubviewChange) object:nil];
    [self performSelector:@selector(respondToSubviewChange) withObject:nil afterDelay:.1];
}

-(void)respondToSubviewChange {
    NSLog(@"here");
   // Do your work here.
}

顺便说一句,如果这段代码所在的类是 Split View的委托(delegate),那么你不需要注册这个通知,它会自动注册。

编辑后:

我确实找到了另一种不使用任何计时机制的方法,但我不知道它有多健壮。它依赖于 splitView:constrainMinCoordinate:ofSubviewAt: 当您在分隔线中按下 mouseDown 并再次使用 mouseUp 时被调用的事实。当应用程序第一次启动时它也会被调用一次(或者可能是当 Split View所在的窗口被加载时,或者其他什么——我没有用多个窗口测试它)。因此,将“timesCalled”设置为 -1(而不是 0)是为了让逻辑在应用程序启动时忽略第一次调用。此后,if 子句在对委托(delegate)方法的所有其他调用(将在 mouseUp 上)上的计算结果为真。

- (CGFloat)splitView:(NSSplitView *)splitView constrainMinCoordinate:(CGFloat)proposedMin ofSubviewAt:(NSInteger)dividerIndex {
    static int timesCalled = -1;
    if (timesCalled % 2 == 1) {
        NSLog(@"Do stuff");
        // Do your work here.
    }
    timesCalled ++;
    return 0 // 0 allows you to minimize the subview all the way to 0;
}

关于objective-c - NSSplitView - 如何在 View 调整大小后收到通知?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16619625/

相关文章:

java - 如何从 Java 运行 Mac 应用程序?

macos - 现在如何设置 NSSplitView 的位置?设置位置 :ofDividerAtIndex: doesn't work and I'm not sure how to make a temporary constraint

cocoa - NSSplitView 和自动布局

IOS : Building Fails

iphone - iOS:XIB 中使用的图像名称

java - 配置为监听端口 80 的 Tomcat 连接器启动失败

swift - NSSplitView:自定义双击处理程序

ios - 无法更新核心数据中的位置

ios - Xcode在制作表单时将默认按钮设置为输入

macos - 如何通过在每个选项卡上执行一些命令在 mac os Lion 的终端上自动打开多个选项卡?