Программно переключить изменение размера NSSplitViewItems
Я пытаюсь найти способ программно изменить размер NSSplitViewItems
,
Скажи NSWindow
размер кадра 500x500px.masterViewItem
имеет ширину 100 пикселей, в то время как subViewItem
имеет ширину 400 пикселей.
когда FOO
, Я хочу masterViewItem
свернуть до 0px (влево), в то время как subViewItem
расширяется, чтобы заполнить все окно (500 пикселей)
когда BAR
, Я хочу masterViewItem
расширить обратно до 100px, в то время как subViewItem
рушится обратно к оригинальному 400px.
- (IBAction) onTapOnSomeButton:(NSButton *)sender {
NSWindow *window = [[NSApplication sharedApplication] mainWindow];
NSSplitViewController *splitViewController = (NSSplitViewController *)[window contentViewController];
NSSplitViewItem *masterViewItem =[splitViewController.splitViewItems firstObject];
NSSplitViewItem *subViewItem = [splitViewController.splitViewItems lastObject];
if (FOO) {
[NSAnimationContext runAnimationGroup:^(NSAnimationContext *context) {
// Expand subViewItem
} completionHandler:^{
}];
} else if (BAR) {
[NSAnimationContext runAnimationGroup:^(NSAnimationContext *context) {
// Expand masterViewItem while shrinking subViewItem
} completionHandler:^{
}];
}
}
Я могу анимировать каждый элемент так, чтобы он, казалось, разрушался / расширялся, т.е.
subViewItem.viewController.view.animator.frame = CGRectMake(0, 0, window.frame.size.width, subViewItem.viewController.view.frame.size.height);
но разделитель не будет двигаться, поэтому эти два элемента будут перемещаться по отдельности, и не будет выглядеть, будто весь экран разваливается / расширяется.
Как бы я это реализовал? Заранее спасибо.
ОБНОВИТЬ
Итак, я сделал немного больше исследований, и нашел это:
Как анимировать NSSplitView при изменении размера?
Итак, я сделал код так:
- (IBAction) onTapOnSomeButton:(NSButton *)sender {
NSWindow *window = [[NSApplication sharedApplication] mainWindow];
NSSplitViewController *splitViewController = (NSSplitViewController *)[window contentViewController];
NSSplitViewItem *masterViewItem =[splitViewController.splitViewItems firstObject];
NSSplitViewItem *subViewItem = [splitViewController.splitViewItems lastObject];
if (FOO) {
NSMutableDictionary *collapseMainAnimationDict = [NSMutableDictionary dictionaryWithCapacity:2];
[collapseMainAnimationDict setObject: subView forKey:NSViewAnimationTargetKey];
NSRect newRightSubViewFrame = subView.frame;
newRightSubViewFrame.size.width = splitViewController.splitView.frame.size.width;
[collapseMainAnimationDict setObject:[NSValue valueWithRect:newRightSubViewFrame] forKey:NSViewAnimationEndFrameKey];
NSMutableDictionary *collapseInspectorAnimationDict = [NSMutableDictionary dictionaryWithCapacity:2];
[collapseInspectorAnimationDict setObject: masterView forKey:NSViewAnimationTargetKey];
NSRect newLeftSubViewFrame = masterView.frame;
newLeftSubViewFrame.size.width = 0.0f;
newLeftSubViewFrame.origin.x = splitViewController.splitView.frame.size.width;
[collapseInspectorAnimationDict setObject:[NSValue valueWithRect:newLeftSubViewFrame] forKey:NSViewAnimationEndFrameKey];
NSViewAnimation *collapseAnimation = [[NSViewAnimation alloc] initWithViewAnimations:[NSArray arrayWithObjects: collapseMainAnimationDict, collapseInspectorAnimationDict, nil]];
[collapseAnimation setDuration:0.3f];
[collapseAnimation startAnimation];
[splitViewController.splitView adjustSubviews];
[splitViewController.splitView setNeedsDisplay: YES];
} else if (BAR) {
// Not yet implemented
}
}
Но безрезультатно. Какие-либо предложения?
2 ответа
Вы должны изменить размеры панелей, используя [NSSplitView setPosition:ofDividerAtIndex:]
,
Я понятия не имею что NSSplitViewController
есть, но, вероятно, вы можете получить доступ к NSSplitView
через его view
собственность или что-то подобное.
Вместо того, чтобы рассматривать его как изменение размера, похоже, что вы просто пытаетесь свернуть / развернуть элемент основного вида. Вы можете просто использовать NSSplitViewItem
"s collapsed
собственность с ее animator
прокси для запуска коллапса:
if (FOO) {
// Expand subViewItem (collapse the master view item)
masterViewItem.animator.collapsed = YES;
И свернуть
} else if (BAR) {
// Expand masterViewItem while shrinking subViewItem
masterViewItem.animator.collapsed = NO;
}
}
В версии 10.11 есть API для обозначения вашего основного элемента представления в качестве "боковой панели", которая имеет дополнительное поведение свертывания / разворачивания для этого элемента (например, наложения).