获取底页以正确加载

问题描述 投票:0回答:1

我正在为我的Xamarin.iOS应用程序添加一个底页,并且我引用了this SO Answer,并且遇到了一些问题。

首先,当我单击用于触发底部工作表的按钮时,它出现了,但不够高,我希望它至少出现到显示内容为止。

我所参考的答案中并没有真正解释我的其他问题,但是我想添加一种方法,如果用户从中抽出,则可以关闭底部的表,但是我不知道该怎么做那。

这是我的底页代码。

public partial class BottomSheetViewController : UIViewController
{
    private nfloat PartialView => UIScreen.MainScreen.Bounds.Height - lblText.Frame.GetMaxY() + UIApplication.SharedApplication.StatusBarFrame.Height;
    private nfloat FullView => 300;

    public BottomSheetViewController() : base("BottomSheetViewController", null)
    {
    }

    public override void ViewWillAppear(bool animated)
    {
        base.ViewWillAppear(animated);

        PrepareBackground();
    }

    public override void ViewDidAppear(bool animated)
    {
        base.ViewDidAppear(animated);

        UIView.Animate(0.6, () =>
        {
            var frame = View.Frame;
            var yComponent = PartialView;

            View.Frame = new CGRect(0, yComponent, frame.Width, frame.Height);
        });
    }

    public override void ViewDidLoad()
    {
        base.ViewDidLoad();

        var gesture = new UIPanGestureRecognizer((g) => PanGesture(g));
        View.AddGestureRecognizer(gesture);

        RoundView();
    }

    private void RoundView()
    {
        View.Layer.CornerRadius = 5;
        View.ClipsToBounds = true;

    }

    private void PrepareBackground()
    {
        var blurEffect = UIBlurEffect.FromStyle(UIBlurEffectStyle.Dark);
        var visualEffect = new UIVisualEffectView(blurEffect);
        var bluredView = new UIVisualEffectView(blurEffect);

        bluredView.ContentView.AddSubview(visualEffect);
        visualEffect.Frame = UIScreen.MainScreen.Bounds;
        bluredView.Frame = UIScreen.MainScreen.Bounds;

        View.InsertSubview(bluredView, 0);
    }

    private void PanGesture(UIPanGestureRecognizer recognizer)
    {
        var translation = recognizer.TranslationInView(View);
        var velocity = recognizer.VelocityInView(View);
        var y = View.Frame.GetMinY();

        if (y + translation.Y >= FullView && y + translation.Y <= PartialView)
        {
            View.Frame = new CGRect(0, y + translation.Y, View.Frame.Width, View.Frame.Height);
            recognizer.SetTranslation(CGPoint.Empty, View);
        }

        if (recognizer.State == UIGestureRecognizerState.Ended)
        {
            var duration = velocity.Y < 0 ? Convert.ToDouble(y - FullView / -velocity.Y) : Convert.ToDouble(PartialView - y / velocity.Y);

            duration = duration > 1.3 ? 1 : duration;

            UIView.Animate(duration, 0.0, UIViewAnimationOptions.AllowAnimatedContent, () =>
            {
                if (velocity.Y >= 0)
                {
                    View.Frame = new CGRect(0, PartialView, View.Frame.Width, View.Frame.Height);
                }
                else
                {
                    View.Frame = new CGRect(0, FullView, View.Frame.Width, View.Frame.Height);
                }
            }, null);
        }
    }
}

如果您想知道我如何介绍底页:

var bottomSheet = new BottomSheetViewController();

AddChildViewController(bottomSheet);
View.AddSubview(bottomSheet.View);
bottomSheet.DidMoveToParentViewController(this);

var height = View.Frame.Height;
var width = View.Frame.Width;

bottomSheet.View.Frame = new CGRect(0, View.Frame.GetMaxY(), width, height);

最下面的表格工作正常,只需要解决一些问题,我需要一些帮助找出我所缺少的内容。

xamarin.ios
1个回答
0
投票

关于第一个问题,您可以将FullView的参数BottomSheetViewController设置为44

public partial class BottomSheetViewController : UIViewController
{
    private nfloat PartialView => UIScreen.MainScreen.Bounds.Height - lblText.Frame.GetMaxY() + UIApplication.SharedApplication.StatusBarFrame.Height;
    private nfloat FullView => 44;

...
}

然后它将显示全屏。如果这不是您想要的,则可以共享一张图片来说明。

[second一个,您可以在当前的View Controller中添加一个UITapGestureRecognizer以实现这一目标:

BottomSheetViewController bottomSheet;

public override void ViewDidLoad ()
{
    base.ViewDidLoad ();

    UITapGestureRecognizer tapGestureRecognizer = new UITapGestureRecognizer(TapMethod);
    tapGestureRecognizer.NumberOfTapsRequired = 1;
    View.AddGestureRecognizer(tapGestureRecognizer);

}

private void TapMethod(UITapGestureRecognizer sender)
{
    Console.WriteLine("Tap--");

    if (sender.State == UIGestureRecognizerState.Ended)
    {
        CGPoint point = sender.LocationInView(null);
        if (!bottomSheet.View.PointInside(bottomSheet.View.ConvertPointFromView(point, View.Window), null))
        {
            Console.WriteLine("remove--");
            bottomSheet.View.RemoveFromSuperview();
            bottomSheet.RemoveFromParentViewController();
        }
    }
}

然后,当触摸Current View控制器的其他区域时,它将消失。

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.