ios - iOS 上 Xamarin.Forms 中动画 TabbedPage 转换的滑动手势

标签 ios animation xamarin.forms gesture tabbedpage

在 iOS 上的 Xamarin.Forms 中,我如何扩展 TabbedPage,以便除了使用底部的选项卡更改页面外,用户还可以向左或向右滑动以更改页面?理想情况下,滑动时页面转换应该是动画的。

所有页面本身都不使用向左或向右手势,因此向左或向右滑动可明确表示希望更改当前页面。

最佳答案

以下代码响应用户滑动手势,使用带有交叉溶解的选项卡更改动画。它为 TabbedPage 创建一个自定义渲染器,为每个方向添加一个 iOS UISwipeGestureRecognizer

手势识别器与页面上的其他手势同时工作(否则,滚动等页面手势将阻止滑动手势工作,除非手势是完全水平的),但它本身不起作用(否则,一次滑动将跨多个页面移动).

[assembly: ExportRenderer(typeof(TabbedPage), typeof(SwipeTabbedRenderer))]

class SwipeTabbedRenderer : TabbedRenderer
{
    public override void ViewWillAppear(bool animated)
    {
        base.ViewWillAppear(animated);

        NativeView.AddGestureRecognizer(new UISwipeGestureRecognizer(() => SelectNextTab(1)) { Direction = UISwipeGestureRecognizerDirection.Left, ShouldRecognizeSimultaneously = ShouldRecognizeSimultaneously });
        NativeView.AddGestureRecognizer(new UISwipeGestureRecognizer(() => SelectNextTab(-1)) { Direction = UISwipeGestureRecognizerDirection.Right, ShouldRecognizeSimultaneously = ShouldRecognizeSimultaneously });
    }

    void SelectNextTab(int direction)
    {
        int nextIndex = TabbedPage.GetIndex(Tabbed.CurrentPage) + direction;
        if (nextIndex < 0 || nextIndex >= Tabbed.Children.Count) return;
        var nextPage = Tabbed.Children[nextIndex];
        UIView.Transition(Platform.GetRenderer(Tabbed.CurrentPage).NativeView, Platform.GetRenderer(nextPage).NativeView, 0.15, UIViewAnimationOptions.TransitionCrossDissolve, null);
        Tabbed.CurrentPage = nextPage;
    }

    static bool ShouldRecognizeSimultaneously(UIGestureRecognizer gestureRecognizer, UIGestureRecognizer otherGestureRecognizer) => gestureRecognizer != otherGestureRecognizer;
}

改进的机会:滑动手势比交叉溶解更好,但是当我尝试使用 CATransition 时要创建一个,动画的初始状态是空白页,而不是起始选项卡的页面。这导致动画感觉有点不和谐。

关于ios - iOS 上 Xamarin.Forms 中动画 TabbedPage 转换的滑动手势,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47586897/

相关文章:

javascript - 在 SVG 动画中围绕舞台原点以外的位置旋转路径

ios - Swift - 选择时的 UITableView 单元格动画

适用于 Xamarin.forms "Safari cannot open the page because the address is invalid"的 Azure AD B2C?

xamarin - 默认字体系列是什么?

ios - 如何响应 revmob sdk uialertview 委托(delegate)?

ios - 每次滚动时 UITableViewCell 都会更改其标签值

ios - 委托(delegate)如何在 objective-c 中工作?

ios - 这是使用 API 最可靠的方式。将 SDK 集成/下载到您的应用程序,或使用 URL-HTTP-GET 方法

javascript - 如何使用 Javascript + CSS 拆分图像?

xamarin.forms - CrossCurrentActivity.Current.Activity 为 NULL,尽管初始化和设置了事件