/ / Monotouch: Как да промените анимацията по подразбиране на промяната на изгледа с NavigationController.PushViewController - анимация, xamarin.ios, изгледи, pushviewcontroller

Monotouch: Как да промените анимацията по подразбиране за промяна на изгледа с NavigationController.PushViewController - анимация, xamarin.ios, изгледи, pushviewcontroller

Използвам NavigationController за навигациямоето приложение. Когато PushViewController стартира (someUIViewController, true), той променя изгледа с анимацията по подразбиране (премества се от дясно на ляво за детска контрола). Как мога да променя тази анимация? Сега използвам това:

this.NavigationController.PushViewController(someUIViewController,true);
UIView.BeginAnimations(null);
UIView.SetAnimationDuration(0.4);
UIView.SetAnimationTransition(UIViewAnimationTransition.FlipFromRight, NavigationController.View,true);
UIView.CommitAnimations();

Но аз съм ограничен до четири UIViewAnimationTransition types.I намери това, което имах нужда (външния вид на гледката от дъното нагоре):

this.NavigationController.PushViewController(someUIViewController,true);
var theAnimation = CABasicAnimation.FromKeyPath("transform.translation.y");
theAnimation.Duration = 0.3f;
theAnimation.From = NSNumber.FromFloat(this.View.Frame.Height);
theAnimation.To = NSNumber.FromFloat(0f);
NavigationController.View.Layer.AddAnimation(theAnimation, "animate");
NavigationController.View.Layer.AnimationForKey("animate");

Но когато CABasicAnimation стартира, по подразбиранеанимацията (преместване от ляво на дясно в родителски контролер) също започва. Резултатът е грешна комбинация. Как мога да стартирам само един (превод на y) или да направя персонализирана анимация?

Отговори:

1 за отговор № 1

Вярвам, че трябва да промените повикването на PushViewController, за да не се анимирате, за да избегнете натискането на анимацията по подразбиране.

this.NavigationController.PushViewController (someUIViewController, вярно);

Би трябвало

this.NavigationController.PushViewController (someUIViewController, фалшива);


0 за отговор № 2

Същият проблем. Няма нормално решение за това. PushViewController е ограничен от стандартната анимация (тип UIViewAnimationTransition). Ако искате да ги промените, опитайте следното:

NavigationController.PushViewController(screen, false);
var theAnimation = CABasicAnimation.FromKeyPath("transform.translation.x");
theAnimation.Duration = 0.6f;
theAnimation.From = NSNumber.FromFloat(-NavigationController.View.Frame.Width);
theAnimation.To = NSNumber.FromFloat(0f);
NavigationController.View.Layer.AddAnimation(theAnimation, "animate");
NavigationController.View.Layer.AnimationForKey("animate");

Но това не е съвършено, опитайте се и вижте защо. Също така можете да използвате PresentViewController. Има някои други стандартни анимации в UIModalTransitionStyle:

this.NavigationController.PresentViewController(new UINavigationController(screen){
ModalTransitionStyle= UIModalTransitionStyle.CoverVertical,
}, true,null);

0 за отговор № 3
//Allows a UINavigationController to push using a custom animation transition
public static void PushControllerWithTransition(this UINavigationController
target, UIViewController controllerToPush,
UIViewAnimationOptions transition)
{
UIView.Transition(target.View, 0.75d, transition, delegate() {
target.PushViewController(controllerToPush, false);
}, null);
}

//Allows a UINavigationController to pop a using a custom animation
public static void PopControllerWithTransition(this UINavigationController
target, UIViewAnimationOptions transition)
{
UIView.Transition(target.View, 0.75d, transition, delegate() {
target.PopViewControllerAnimated(false);
}, null);
}

// С тези разширения в обхвата, преместването между контролерите с флип анимация сега е толкова тривиално, колкото това:

//Pushing someController to the top of the stack
NavigationController.PushControllerWithTransition(someController,
UIViewAnimationOptions.TransitionFlipFromLeft);

//Popping the current controller off the top of the stack
NavigationController.PopControllerWithTransition(
UIViewAnimationOptions.TransitionFlipFromRight);