xamarin - Xamarin 模态页面过渡到普通页面
问题描述
Xamarin 具有默认的页面过渡动画。模态页从下到上,普通页从右到左。有没有办法将模态页面过渡动画应用于普通页面。
我使用 NavigationPageRenderer 在 iOS 中尝试了各种 CATransition 动画。我无法匹配 xamarin 默认提供的确切模式页面动画。
protected override Task<bool> OnPushAsync(Page page, bool animated)
{
var type = page.GetType();
if (Startup.Instance.ModalPages.Contains(type))
{
var transition = CATransition.CreateAnimation();
transition.Duration = 0.5f;
transition.Type = CAAnimation.TransitionMoveIn; //tried other animation transitions
transition.Subtype = CAAnimation.TransitionFromTop;
View.Layer.AddAnimation(transition, null);
return base.OnPushAsync(page, false);
}
else
{
return base.OnPushAsync(page, animated);
}
}
protected override Task<bool> OnPopViewAsync(Page page, bool animated)
{
var type = page.GetType();
if (Startup.Instance.ModalPages.Contains(type))
{
var transition = CATransition.CreateAnimation();
transition.Duration = 0.5f;
transition.Type = CAAnimation.TransitionReveal;
transition.Subtype = CAAnimation.TransitionFromBottom;
View.Layer.AddAnimation(transition, null);
return base.OnPopViewAsync(page, false);
}
else
{
return base.OnPopViewAsync(page, animated);
}
谢谢
解决方案
有没有办法将模态页面过渡动画应用于普通页面。
如果只是想 与普通页面的导航保持相同的TransitionStyle 。你可以隐藏的NavigationBar
时候PushAsync
,而不需要使用PushModelAsync
。
例如 MainPageButton_Clicked
的方法如下:
private void Button_Clicked(object sender, EventArgs e)
{
Navigation.PushAsync(new PageTwo());
}
然后PageTwo:
public partial class PageTwo : ContentPage
{
public PageTwo()
{
InitializeComponent();
NavigationPage.SetHasNavigationBar(this, false);
}
private void Button_Clicked(object sender, EventArgs e)
{
Navigation.PopAsync();
}
}
效果应该是你想要的:
=============================更新===================== ===============
如果需要使用PushModelAsync,有一种变通方法可以达到该效果。
在 iOS 解决方案中为 PageTwo创建一个CustomPageRenderer :
[assembly: ExportRenderer(typeof(PageTwo), typeof(CustomPageRenderer))]
namespace XamarinMoelNavigationStyle.iOS
{
public class CustomPageRenderer :PageRenderer
{
public override void ViewWillAppear(bool animated)
{
var transition = CATransition.CreateAnimation();
transition.Duration = 0.5f;
transition.Type = CAAnimation.TransitionPush;
transition.Subtype = CAAnimation.TransitionFromRight;
View.Layer.AddAnimation(transition, null);
base.ViewWillAppear(animated);
}
}
}
我们将在ViewWillAppear
方法中添加动画。
弹出到上一个MainPage
时,我们可以在 ContentPage 中处理如下:
private void Button_Clicked(object sender, EventArgs e)
{
PageTwoView.TranslateTo(300, 0, 500);
Device.StartTimer(TimeSpan.FromSeconds(0.5), () =>
{
// Do something
Navigation.PopModalAsync(false);
return false; // True = Repeat again, False = Stop the timer
});
}
这PageTwoView
是从 Xaml 定义的:
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:d="http://xamarin.com/schemas/2014/forms/design"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
x:Name="PageTwoView"
x:Class="XamarinMoelNavigationStyle.PageTwo">
...
</ContentPage>
注意:MainPage
导航到时PageTwo
,需要禁用动画。
如 :
private void Button_Clicked(object sender, EventArgs e)
{
Navigation.PushModalAsync(new PageTwo(), false);
}
效果:
推荐阅读
- javascript - 使用 Ajax 调用调用 api
- python - python - 使用 pdfPages / matplotlib 在 pdf 中放置几个图 - ValueError: No figure AxesImage(54,36;334.8x217.44)
- r - R GRanges:在减少 GRanges 时计算平均元数据值
- r - 使用包 dplyr 的summise
- javascript - 我的 disabled 属性不起作用 javascript
- python - Relativ Windows Shotcut - 回溯错误
- list - 在 SwiftUI macOS 12 中更改列表中的空单元格大小
- amazon-web-services - 具有角度前端的微服务架构的身份验证 (AWS Cognito)
- html - 在某些手机上,导航栏无法覆盖整个页面宽度
- c# - 尝试在 Web API Core 中使用 EF Core 在启动时更新数据库时出现“'无法访问已处置的对象”错误