Как использовать CATransition для переключения контроллера вида в Какао? - PullRequest
1 голос
/ 17 октября 2011

У меня есть приложение Mac, и я хочу переключаться между двумя типами представлений: от подробного вида до вида редактирования .

Оба имеют свое собственное представлениеконтроллеры и когда DetailViewController загружен, я хочу иметь возможность загрузить EditViewController при нажатии кнопки.Пока проблем нет.

Но я также хочу использовать CATransition или аналогичный, чтобы EditViewController скользил справа, а DetailViewController - слева.Так же, как карусель изображений.

Как изменить текущий код для поддержки этого эффекта перехода?(QuartzCore уже импортирован в проект)

- (IBAction)edit:(id)sender {
    // NOTE: self is a DetailViewController
    EditViewController *editController = [[EditViewController alloc] 
            initWithNibName:@"EditView" bundle:nil];
    [editController.view setFrame:self.view.frame];
    [self.view addSubview:editController.view];
}

1 Ответ

0 голосов
/ 14 ноября 2011

Я делаю что-то очень похожее для iPhone.Однако принципал должен быть очень похожим.В приведенных ниже примерах кода измените UIView на NSView и т. Д.

Во-первых, вам потребуется контроллер корневого представления, который обрабатывает переключение между детализацией и редактированием.

В нем естьметод что-то вроде этого.Старое и новое представления, переданные в метод, представляют собой view ivars, принадлежащие старому и новому контроллеру представления:

- (void) slideInNewViewFromRight:(UIView *)newView oldView:(UIView *)oldView remove:(BOOL)remove
{
    UIView *superView = [oldView superview];

    [superView insertSubview:newView belowSubview:oldView];

    CGRect oldFrame = [oldView frame];
    oldFrame.origin = CGPointMake(-kScreenWidth, 0.0f);

    CGRect newFrame = [newView frame];
    newFrame.origin = CGPointMake(kScreenWidth, 0.0f);
    newView.frame = newFrame;

    newFrame.origin = CGPointMake(0.0f, 0.0f);

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
    [UIView setAnimationDuration:kSlideOffDuration];
    [UIView setAnimationDelegate:self];

        if (remove) {
            [self setViewToRemove:oldView];
            [UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)];
        }

        [oldView setFrame:oldFrame];
        [newView setFrame:newFrame];

    [UIView commitAnimations];
}

Метод делегата animationDidStop будет обрабатывать удаление старого view из superview когда он завершает:

- (void) animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context
{
    [viewToRemove removeFromSuperview];
}

И не забывая о константах:

#define kScreenWidth                    320.0f
#define kSlideInDuration                0.2f

Возможно, кто-то там думает, почему я не сделал это, используя UITabBarController илиUINavigationController?Ответ в том, что ни один из них не имел смысла в моем случае из-за неиерархической структуры моих контроллеров представления.На самом деле мой больше похож на сеть.Итак, я справляюсь со всем с помощью пользовательского контроллера корневого представления.

Что касается CATransition, я никогда не использовал его.Мне было бы интересно узнать больше о его приложениях и о том, сможет ли он предоставить более элегантное решение этой проблемы.

...