我需要知道任何 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/