Я создал подкласс NSView, чтобы создать представление контейнера (которое я назвал TRTransitionView), которое используется для размещения двух подпредставлений. Одним нажатием кнопки я хочу перевести одно подпредставление из родительского представления, а другое - с использованием типа перехода Core Animation: kCATransitionPush. По большей части у меня все работает так, как вы и ожидали ( вот базовый тестовый проект, который я создал вместе ).
Проблема, с которой я сталкиваюсь, связана с изменением размера моего окна и переключением , а затем между двумя представлениями. После изменения размера окна мои подпредставления появятся в казалось бы случайных местах в моем TRTransitionView. Кроме того, создается впечатление, что TRTransitionView неправильно растянулся и обрезает содержимое своих подпредставлений. В идеале я хотел бы, чтобы подпредставления всегда были привязаны к верхнему левому углу их родительского представления, а также увеличивались, чтобы увеличить размер родительского представления.
Вторая проблема связана с NSTableView, который я поместил в свое первое подпредставление. Когда размер моего окна изменяется, и мой TRTransitionView изменяет размеры, чтобы соответствовать его новым измерениям, мой TableView, кажется, изменяет свой контент довольно неловко (кажется, что вся таблица колеблется вокруг), и недавно расширенное пространство, которое занимает таблица, кажется, «мигает» как будто в процессе анимации). Крайне сложно описать, но есть ли способ остановить это?
Вот мой класс TRTransitionView:
-(void) awakeFromNib
{
[self setWantsLayer:YES];
[self addSubview:[self currentView]];
transition = [CATransition animation];
[transition setType:kCATransitionPush];
[transition setSubtype:kCATransitionFromLeft];
[self setAnimations: [NSDictionary dictionaryWithObject:transition forKey:@"subviews"]];
}
- (void)setCurrentView:(NSView*)newView
{
if (!currentView) {
currentView = newView;
return;
}
[[self animator] replaceSubview:currentView with:newView];
currentView = newView;
}
-(IBAction) switchToViewOne:(id)sender
{
[transition setSubtype:kCATransitionFromLeft];
[self setCurrentView:viewOne];
}
-(IBAction) switchToViewTwo:(id)sender
{
[transition setSubtype:kCATransitionFromRight];
[self setCurrentView:viewTwo];
}