IOS / Objective-C / Storyboard: пользовательский переход слева направо Создание черной полосы между контроллерами представления - PullRequest
0 голосов
/ 07 сентября 2018

Я создал подкласс UIStoryboardSegue, чтобы создать переход слева направо. Это работает, однако, есть черная вертикальная полоса или фон, который на мгновение виден между двумя контроллерами представления, которые наносят эффект. (Я хочу, чтобы переход выглядел как нормальный справа налево, показывать переход, но в противоположном направлении). Кто-нибудь знает, что может быть причиной этого или как от него избавиться? Вот мой код:

#import "customSegue.h"
#import "QuartzCore/QuartzCore.h"

@implementation customSegue

-(void)perform {

    UIViewController *sourceViewController = (UIViewController*)[self sourceViewController];
    UIViewController *destinationController = (UIViewController*)[self destinationViewController];

    CATransition* transition = [CATransition animation];
    transition.duration = .25;
    transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
    transition.type = kCATransitionPush; //kCATransitionMoveIn; //, kCATransitionPush, kCATransitionReveal, kCATransitionFade
    transition.subtype = kCATransitionFromLeft; //kCATransitionFromLeft, kCATransitionFromRight, kCATransitionFromTop, kCATransitionFromBottom



    [sourceViewController.navigationController.view.layer addAnimation:transition
                                                                forKey:kCATransition];

    [sourceViewController.navigationController pushViewController:destinationController animated:NO];

}
@end

Edit:

Я думал, что соберу некоторые исправления, которые я нашел, хотя ни один из них не работает для меня.

Установите цвет фона представляемого контроллера представления на белый

Set self.definesPresentationContext = YES; на контроллере представления представления или установите флажок «Определить контекст» для ВК в раскадровке из принятого ответа здесь .

Укажите контекст следующим образом:

UIViewController *rootViewController = [UIApplication sharedApplication].delegate.window.rootViewController;
    rootViewController.modalPresentationStyle = UIModalPresentationCurrentContext;
    UIViewController *destinationController = (UIViewController*)[self destinationViewController]
    [sourceViewController presentViewController:destinationController animated:NO completion:nil];

из принятого ответа здесь .

1 Ответ

0 голосов
/ 08 сентября 2018

То, что вы видите, - это изменяющаяся непрозрачность вида вблизи начала и конца анимации, поэтому «черная полоса», которую вы видите, на самом деле является задним окном. Хотя это может и не быть идеальным, быстрое решение состоит в том, чтобы изменить цвет фона вашего окна, чтобы он соответствовал цвету фона вашего конечного контроллера представления (затем установите его обратно после завершения перехода, если это необходимо).

Вот пример кода с необходимыми изменениями:

-(void)perform {
    UIViewController *sourceViewController = (UIViewController*)[self sourceViewController];
    UIViewController *destinationController = (UIViewController*)[self destinationViewController];

    CATransition* transition = [CATransition animation];
    CGFloat animationDuration = 0.25f;
    transition.duration = animationDuration;
    transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
    transition.type = kCATransitionPush; //kCATransitionMoveIn; //, kCATransitionPush, kCATransitionReveal, kCATransitionFade
    transition.subtype = kCATransitionFromLeft; //kCATransitionFromLeft, kCATransitionFromRight, kCATransitionFromTop, kCATransitionFromBottom
    transition.fillMode = kCAFillModeForwards;



    [sourceViewController.navigationController.view.layer addAnimation:transition
                                                                forKey:kCATransition];
    // hold onto the previous window background color
    UIColor *previousWindowBackgroundColor = sourceViewController.view.window.backgroundColor;
    // switch the window background color to match the destinationController's background color temporarily
    sourceViewController.view.window.backgroundColor = destinationController.view.backgroundColor;
    // do the transition
    [sourceViewController.navigationController pushViewController:destinationController animated:NO];
    // switch the window color back after the transition duration from above
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(animationDuration * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        // make sure we still have a handle on the destination controller
        if (destinationController) {
            destinationController.view.window.backgroundColor = previousWindowBackgroundColor;
        }
    });
}

Вот пример перехода, замедленного до 2 секунд:

Замедленный переход

И анимация на 0,25, как она есть в вашем коде:

Ваша скорость перехода

...