NSView изменяет размер шатким - PullRequest
2 голосов
/ 14 сентября 2011

У меня есть MAAttachedWindow (подкласс NSWindow), который содержит пустое представление (contentView) и произвольное подпредставление (прямо сейчас NSImageView). При загрузке я пытаюсь анимировать изменение размера окна на 100 пикселей по вертикали.

Этот блок кода инициализирует мое окно и представления:

_popoverContentView = [[NSView alloc] initWithFrame: aFrame];
NSImageView *img = [[NSImageView alloc] initWithFrame: aFrame];
[img setImage: [NSImage imageName: "@my_debug_image"]];
[img setAutoresizingMask: NSViewHeighSizable];
[_popoverContentView setAutoresizesSubviews: YES];
[_popoverContentView addSubview: img];
popover = [[MAAttachedWindow alloc] initWithView: _popoverContentView attachedToPoint: aPoint inWindow: nil onSide: MAPositionBottom atDistance: aDist];

И этот блок кода отвечает за анимацию:

NSRect newPopoverFrame = popover.frame;
NSRect newPopoverContentViewFrame = _popoverContentView.frame;

newPopoverFrame.size.height += 100;
newPopoverContentViewFrame.size.height += 100;

[_popoverContentView animator] setFrame: newPopoverContentViewFrame];
[[popover animator] setFrame: newPopoverFrame display: YES animate: YES];

Теперь все это работает (почти) как и ожидалось, однако, как показано в этом видео , анимация ненадежна, шатка и нервозна. Кажется, я не могу точно определить, что в моем коде вызывает это, или как заблокировать представление изображения на месте.

1 Ответ

1 голос
/ 15 сентября 2011

Я думаю, что проблема в том, что вы используете новый (ish) прокси-сервер аниматора для анимации рамки окна, а также гораздо более старый параметр animate: NSWindow setFrame:display:animate:, который использует старый NSViewAnimation API.

Эти два метода анимации, вероятно, конфликтуют, поскольку они пытаются анимировать окно одновременно, используя разные пути кода.

Вам также нужно обернуть несколько вызовов на прокси-сервер аниматора в [NSAnimationContext beginGrouping] и [NSAnimationContext endGrouping], если вы хотите, чтобы анимации были одновременными.

Попробуйте сделать это:

[NSAnimationContext beginGrouping];
[_popoverContentView animator] setFrame: newPopoverContentViewFrame];
[[popover animator] setFrame: newPopoverFrame display: YES animate:NO];
[NSAnimationContext endGrouping];

Если это не сработает, вы можете отказаться от использования проблемного метода setFrame:display:animate: и просто анимировать позицию и размер независимо:

[NSAnimationContext beginGrouping];
[_popoverContentView animator] setFrame: newPopoverContentViewFrame];
[[popover animator] setFrameOrigin: newPopoverFrame.origin];
[[popover animator] setFrameSize: newPopoverFrame.size];
[NSAnimationContext endGrouping];

Группировка контекстов анимации гарантирует, что все происходит одновременно.

...