using System;
|
using CoreGraphics;
|
using Foundation;
|
using UIKit;
|
|
|
|
namespace Shared
|
{
|
/// <summary>
|
/// 右滑抽屉View
|
/// </summary>
|
public class UIDrawerLayout : ViewGroup
|
{
|
/// <summary>
|
/// 当前视图
|
/// </summary>
|
/// <value>The UICoverFlowView.</value>
|
MyUIDrawerLayout mUIDrawerLayout
|
{
|
get
|
{
|
return uiView as MyUIDrawerLayout;
|
}
|
set
|
{
|
uiView = value;
|
}
|
}
|
|
/// <summary>
|
/// 左侧菜单View
|
/// </summary>
|
UIView leftView;
|
/// <summary>
|
/// 主菜单View
|
/// </summary>
|
UIView mainView;
|
/// <summary>
|
/// 蒙层遮挡View
|
/// </summary>
|
MyMaskUIView maskUIView;
|
|
|
/// <summary>
|
/// 构造函数
|
/// </summary>
|
public UIDrawerLayout()
|
{
|
|
mUIDrawerLayout = new MyUIDrawerLayout(this) { };
|
viewGroup = mUIDrawerLayout;
|
mainView = new UIView();
|
realViewGroup = mainView;
|
viewGroup.AddSubview(realViewGroup);
|
viewGroup.Layer.MasksToBounds = true;
|
leftView = new UIView();
|
//new UIView(new CGRect(0, 0, Application.CurrentWidth, Application.CurrentHeight));
|
var leftViewFrame = leftView.Frame;
|
leftViewFrame.Y = 0;
|
leftViewFrame.X = 0;
|
leftViewFrame.Width = Application.CurrentWidth;
|
leftViewFrame.Height = Application.CurrentHeight;
|
leftViewFrame.X = -Application.CurrentWidth;
|
leftView.Frame = leftViewFrame;
|
leftView.BackgroundColor = UIColor.FromRGBA(0, 0, 0, 99);
|
viewGroup.AddSubview(leftView);
|
|
maskUIView = new MyMaskUIView();
|
var maskFrame = maskUIView.Frame;
|
maskFrame.Y = 0;
|
maskFrame.X = 0;
|
maskFrame.Width = Application.CurrentWidth;
|
maskFrame.Height = Application.CurrentHeight;
|
maskUIView.Frame = maskFrame;
|
maskUIView.BackgroundColor = UIColor.FromRGBA(0, 0, 0, 0);
|
viewGroup.AddSubview(maskUIView);
|
}
|
|
/// <summary>
|
/// 刷新左View显示的位置
|
/// </summary>
|
/// <param name="leftFrame">最终view的位置</param>
|
/// <param name="needAnimations">是否需要平移动画</param>
|
void RefreshLeftViewFrame(CGRect leftFrame, bool needAnimations = true)
|
{
|
//leftView.Frame = leftFrame;
|
//RefreshMaskUIViewBackgroundColor(leftView.Frame.X);
|
|
//2020-06-11 增加平移动画
|
if (!needAnimations)
|
{
|
leftView.Frame = leftFrame;
|
RefreshMaskUIViewBackgroundColor(leftView.Frame.X);
|
}
|
else
|
{
|
UIView.BeginAnimations("move");
|
UIView.SetAnimationDuration(0.5);
|
//UIView.SetAnimationDelegate(leftView);
|
leftView.Frame = leftFrame;
|
RefreshMaskUIViewBackgroundColor(leftView.Frame.X);
|
UIView.CommitAnimations();
|
|
}
|
|
}
|
|
/// <summary>
|
/// 刷新蒙层View的位置和透明度颜色
|
/// </summary>
|
/// <param name="leftViewX"></param>
|
void RefreshMaskUIViewBackgroundColor(nfloat leftViewX)
|
{
|
int alpha = 180 + (int)(leftViewX / mUIDrawerLayout.Frame.Size.Width * 180);
|
maskUIView.BackgroundColor = UIColor.FromRGBA(0, 0, 0, alpha);
|
var maskFrame = maskUIView.Frame;
|
maskFrame.X = leftView.Frame.X + leftView.Frame.Width;
|
maskUIView.Frame = maskFrame;
|
}
|
|
|
View leftChildView;
|
/// <summary>
|
/// 增加左边视图
|
/// </summary>
|
/// <param name="view">View.</param>
|
public void AddLeftView(View view)
|
{
|
if (null == view)
|
{
|
return;
|
}
|
LeftViewRemoveAllViews();
|
|
view.Parent = this;
|
leftChildView = view;
|
var addFrame = leftView.Frame;
|
addFrame.X = 0;
|
addFrame.Y = 0;
|
leftChildView.RealView.Frame = addFrame;
|
leftView.AddSubview(leftChildView.RealView);
|
|
}
|
|
|
/// <summary>
|
/// RemoveLeftView
|
/// </summary>
|
public void LeftViewRemoveAllViews()
|
{
|
if (leftChildView == null) return;
|
|
|
if (leftChildView.RealView.Superview != null)
|
{
|
leftChildView.RealView.RemoveFromSuperview();
|
}
|
|
leftChildView.Parent = null;
|
}
|
|
/// <summary>
|
/// 是否锁定右滑功能, 锁定后右滑弹出菜单失效
|
/// </summary>
|
bool isDrawerLockModei;
|
public bool IsDrawerLockMode
|
{
|
get
{
return isDrawerLockModei;
}
|
set
|
{
|
isDrawerLockModei = value;
|
mUIDrawerLayout.IsDrawerLockMode = isDrawerLockModei;
|
}
|
}
|
|
bool isDrawerOpen = false;
|
|
private bool IsDrawerOpen
|
{
|
get
{
return isDrawerOpen;
}
|
set
|
{
|
isDrawerOpen = value;
|
mUIDrawerLayout.IsDrawerOpen = isDrawerOpen;
|
|
|
}
|
}
|
|
/// <summary>
|
/// 打开抽屉view
|
/// </summary>
|
public void OpenLeftMenu()
|
{
|
if (!IsDrawerOpen)
|
{
|
IsDrawerOpen = true;
|
ShowLeftView(IsDrawerOpen);
|
//Shared.HDLUtils.WriteLine("OpenLeftMenu-------");
|
}
|
|
}
|
|
/// <summary>
|
/// 关闭抽屉view
|
/// </summary>
|
public void CloseLeftMenu()
|
{
|
if (IsDrawerOpen)
|
{
|
IsDrawerOpen = false;
|
ShowLeftView(IsDrawerOpen);
|
//Shared.HDLUtils.WriteLine("CloseLeftMenu-------");
|
}
|
}
|
|
|
//private CABasicAnimation moveX(float X)
|
//{
|
// //CABasicAnimation animation = new CABasicAnimation("transform.translation.x");
|
// CABasicAnimation animation = CABasicAnimation.FromKeyPath("transform.translation.x");
|
// animation.To = NSNumber.FromFloat(X);
|
// animation.Duration = 0.2F;
|
// animation.RemovedOnCompletion = false;//yes的话,又返回原位置了。
|
// animation.RepeatCount = 1;
|
// animation.FillMode = CAFillMode.Forwards;
|
// return animation;
|
//}
|
|
|
/// <summary>
|
/// 是否打开显示左边菜单view
|
/// </summary>
|
private void ShowLeftView(bool bShow)
|
{
|
var mFrame = leftView.Frame;
|
mFrame.X = bShow ? 0 : -mUIDrawerLayout.Frame.Size.Width;
|
RefreshLeftViewFrame(mFrame);
|
}
|
|
|
/// <summary>
|
/// 移动左边view
|
/// </summary>
|
public void MoveLeftView(nfloat moveX)
|
{
|
if (IsDrawerOpen)
|
{
|
if (moveX < 0)
|
{
|
var mFrame = leftView.Frame;
|
mFrame.X = 0 + moveX;
|
RefreshLeftViewFrame(mFrame,false);
|
}
|
}
|
else
|
{
|
if (moveX > 0)
|
{
|
var mFrame = leftView.Frame;
|
mFrame.X = -mUIDrawerLayout.Frame.Size.Width + moveX;
|
RefreshLeftViewFrame(mFrame,false);
|
}
|
|
}
|
}
|
|
|
/// <summary>
|
/// 重置左边view
|
/// </summary>
|
public void ResetView()
|
{
|
|
var mFrame = leftView.Frame;
|
if (IsDrawerOpen)
|
{
|
mFrame.X = 0;
|
//Shared.HDLUtils.WriteLine($"Reset Open");
|
}
|
else
|
{
|
mFrame.X = -mUIDrawerLayout.Frame.Size.Width;
|
//Shared.HDLUtils.WriteLine($"Reset CLOSE");
|
}
|
|
RefreshLeftViewFrame(mFrame);
|
}
|
|
|
nfloat mLastX, mLastY, deltaX;
|
int mTouchSlop = 3;
|
|
private void MYTouchEvent(EventActions eventAction, CGPoint point)
|
{
|
if (isDrawerLockModei) return;
|
|
switch (eventAction)
|
{
|
case EventActions.Down:
|
|
//记录点击的最新X坐标
|
mLastX = point.X;
|
mLastY = point.Y;
|
//Shared.HDLUtils.WriteLine($"DrawerLayout:EventActions.Down XXX{mLastX}");
|
break;
|
case EventActions.Move:
|
moveWithPoint(point);
|
//Shared.HDLUtils.WriteLine("DrawerLayout:EventActions.Move");
|
break;
|
case EventActions.Up:
|
//Shared.HDLUtils.WriteLine($"DrawerLayout:EventActions.Down deltaX{deltaX} WWW:{mUIDrawerLayout.Frame.Size.Width} ");
|
if (Math.Abs(deltaX) >= mUIDrawerLayout.Frame.Size.Width / 2)
|
{
|
if (deltaX > 0)
|
{
|
IsDrawerOpen = true;
|
ShowLeftView(IsDrawerOpen);
|
}
|
else
|
{
|
IsDrawerOpen = false;
|
ShowLeftView(IsDrawerOpen);
|
}
|
}
|
else
|
{
|
ResetView();
|
|
}
|
break;
|
|
}
|
}
|
|
private void moveWithPoint(CGPoint movePoint)
|
{
|
var x = movePoint.X;
|
deltaX = x - mLastX;
|
|
if (deltaX * deltaX > mTouchSlop * mTouchSlop)
|
{
|
//开始移动视图
|
if (IsDrawerOpen)
|
{
|
//MoveAction?.Invoke(deltaX);
|
MoveLeftView(deltaX);
|
}
|
else
|
{
|
if (mLastX < 10)
|
{
|
MoveLeftView(deltaX);
|
}
|
}
|
|
}
|
|
}
|
|
|
/// <summary>
|
/// 垂直方向滚动视图
|
/// </summary>
|
class MyUIDrawerLayout : UIView
|
{
|
public bool IsDrawerOpen = false;
|
public bool IsDrawerLockMode = false;
|
|
[Weak] internal UIDrawerLayout mUIDrawerLayout;
|
|
public MyUIDrawerLayout(UIDrawerLayout mUIDrawerLayout)
|
{
|
this.mUIDrawerLayout = mUIDrawerLayout;
|
}
|
|
|
/// <summary>
|
/// 寻找最适合的View
|
/// 实现拦截
|
/// </summary>
|
public override UIView HitTest(CGPoint point, UIEvent uievent)
|
{
|
|
//Shared.HDLUtils.WriteLine($"MyUIDrawerLayout:HitTest{point.X} uievent{uievent.ToString()}");
|
|
if (!IsDrawerLockMode)//不锁定,允许右滑
|
{
|
if (PointInside(point, uievent))
|
{
|
if (IsDrawerOpen)//左菜单是否打开
|
{
|
if (point.X > this.Frame.Size.Width - 10)
|
{
|
//Shared.HDLUtils.WriteLine($"MyUIDrawerLayout:HitTest{point.X} uievent{uievent.ToString()}");
|
return this;//拦截
|
}
|
|
}
|
else
|
{
|
if (point.X < 10)
|
{
|
//Shared.HDLUtils.WriteLine($"MyUIDrawerLayout:HitTest{point.X} uievent{uievent.ToString()}");
|
return this;
|
}
|
}
|
|
}
|
}
|
|
return base.HitTest(point, uievent);//不拦截
|
|
//UIView viewReturn = base.HitTest(point, uievent);
|
//if (viewReturn is MyUIDrawerLayout)
|
//{
|
// return base.HitTest(point, uievent);//不拦截
|
//}
|
//else {
|
|
|
// return base.HitTest(point, uievent);//不拦截
|
//}
|
}
|
|
|
/// <summary>
|
/// 点击开始
|
/// </summary>
|
/// <param name="touches">Touches.</param>
|
/// <param name="evt">Evt.</param>
|
public override void TouchesBegan(NSSet touches, UIEvent evt)
|
{
|
//Shared.HDLUtils.WriteLine("MyUIDrawerLayout:TouchesBegan");
|
mUIDrawerLayout?.TouchEvent(EventActions.Down, (touches.AnyObject as UITouch).LocationInView(this));
|
mUIDrawerLayout?.MYTouchEvent(EventActions.Down, (touches.AnyObject as UITouch).LocationInView(this));
|
|
}
|
/// <summary>
|
/// 移动
|
/// </summary>
|
/// <param name="touches">Touches.</param>
|
/// <param name="evt">Evt.</param>
|
public override void TouchesMoved(NSSet touches, UIEvent evt)
|
{
|
mUIDrawerLayout?.TouchEvent(EventActions.Move, (touches.AnyObject as UITouch).LocationInView(this));
|
mUIDrawerLayout?.MYTouchEvent(EventActions.Move, (touches.AnyObject as UITouch).LocationInView(this));
|
}
|
|
/// <summary>
|
/// 点击弹起
|
/// </summary>
|
/// <param name="touches">Touches.</param>
|
/// <param name="evt">Evt.</param>
|
public override void TouchesEnded(NSSet touches, UIEvent evt)
|
{
|
mUIDrawerLayout?.TouchEvent(EventActions.Up, (touches.AnyObject as UITouch).LocationInView(this));
|
mUIDrawerLayout?.MYTouchEvent(EventActions.Up, (touches.AnyObject as UITouch).LocationInView(this));
|
//Shared.HDLUtils.WriteLine("MyUIDrawerLayout:TouchesEnded");
|
}
|
|
public override void TouchesCancelled(NSSet touches, UIEvent evt)
|
{
|
mUIDrawerLayout?.TouchEvent(EventActions.Cancel, (touches.AnyObject as UITouch).LocationInView(this));
|
mUIDrawerLayout?.MYTouchEvent(EventActions.Cancel, (touches.AnyObject as UITouch).LocationInView(this));
|
}
|
/// <summary>
|
/// 框架默认加了两个UIImageView ,这样可以去掉默认添加
|
/// </summary>
|
/// <param name="view">View.</param>
|
public override void AddSubview(UIView view)
|
{
|
if (view.GetType() == typeof(UIImageView) && view.Tag != int.MinValue)
|
{
|
return;
|
}
|
base.AddSubview(view);
|
}
|
}
|
|
|
|
/// <summary>
|
/// 蒙层View
|
/// </summary>
|
class MyMaskUIView : UIView
|
{
|
public MyMaskUIView()
|
{
|
|
|
|
}
|
|
/// <summary>
|
/// 寻找最适合的View
|
/// 实现拦截
|
/// </summary>
|
public override UIView HitTest(CGPoint point, UIEvent uievent)
|
{
|
return null;
|
}
|
|
}
|
|
}
|
}
|