我正在为我的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);
最下面的表格工作正常,只需要解决一些问题,我需要一些帮助找出我所缺少的内容。
关于第一个问题,您可以将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控制器的其他区域时,它将消失。