2017-12-01 27 views
1

iOS의 Xamarin.Forms에서 하단의 탭을 사용하여 페이지를 변경하는 것 외에도 사용자가 왼쪽 또는 오른쪽으로 스 와이프 할 수 있도록 TabbedPage을 어떻게 확장 할 수 있습니까? 페이지를 변경 하시겠습니까? 이상적으로는 페이지를 전환 할 때 스 와이프 할 때 애니메이션이 적용되어야합니다.iOS의 Xamarin.Forms에서 움직이는 TabbedPage 전환을위한 스 와이프 제스처

페이지 내에서 왼쪽 또는 오른쪽 제스처를 사용하지 않으므로 왼쪽 또는 오른쪽으로 스 와이프하면 현재 페이지를 변경하려는 뜻을 모호하게 나타낼 수 있습니다.

답변

2

다음 코드는 크로스 디졸브로 애니메이션 된 탭 변경으로 사용자가 스 와이프하는 동작에 응답합니다. 각 방향에 대해 iOS 을 추가하는 TabbedPage 용 사용자 정의 렌더러를 만듭니다.

제스처 인식기는 페이지의 다른 제스처와 동시에 작동합니다. 그렇지 않으면 스크롤과 같은 페이지 제스처는 제스처가 완전히 수평이 아닌 경우 스 와이프 제스처가 작동하지 않도록하지만 자체적으로 작동하지 않습니다 (그렇지 않으면 한 번 스 와이프가 페이지). 개선을위한

[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을 사용하려고 할 때, 애니메이션의 초기 상태가 빈 페이지가 아닌 페이지이었다 시작 탭. 이로 인해 애니메이션의 느낌이 약간 떨리게되었습니다.