using System;
using CoreGraphics;
using Foundation;
using UIKit;
namespace Shared
{
///
/// 右滑抽屉View
///
public class UIDrawerLayout : ViewGroup
{
///
/// 当前视图
///
/// The UICoverFlowView.
MyUIDrawerLayout mUIDrawerLayout
{
get
{
return uiView as MyUIDrawerLayout;
}
set
{
uiView = value;
}
}
///
/// 左侧菜单View
///
UIView leftView;
///
/// 主菜单View
///
UIView mainView;
///
/// 蒙层遮挡View
///
MyMaskUIView maskUIView;
///
/// 构造函数
///
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);
}
///
/// 刷新左View显示的位置
///
/// 最终view的位置
/// 是否需要平移动画
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.3);
//UIView.SetAnimationDelegate(leftView);
leftView.Frame = leftFrame;
RefreshMaskUIViewBackgroundColor(leftView.Frame.X);
UIView.CommitAnimations();
}
}
///
/// 刷新蒙层View的位置和透明度颜色
///
///
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;
///
/// 增加左边视图
///
/// View.
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);
}
///
/// RemoveLeftView
///
public void LeftViewRemoveAllViews()
{
if (leftChildView == null) return;
if (leftChildView.RealView.Superview != null)
{
leftChildView.RealView.RemoveFromSuperview();
}
leftChildView.Parent = null;
}
///
/// 是否锁定右滑功能, 锁定后右滑弹出菜单失效
///
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;
}
}
///
/// 打开抽屉view
///
public void OpenLeftMenu()
{
if (!IsDrawerOpen)
{
IsDrawerOpen = true;
ShowLeftView(IsDrawerOpen);
//Shared.HDLUtils.WriteLine("OpenLeftMenu-------");
}
}
///
/// 关闭抽屉view
///
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;
//}
///
/// 是否打开显示左边菜单view
///
private void ShowLeftView(bool bShow)
{
var mFrame = leftView.Frame;
mFrame.X = bShow ? 0 : -mUIDrawerLayout.Frame.Size.Width;
RefreshLeftViewFrame(mFrame);
}
///
/// 移动左边view
///
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);
}
}
}
///
/// 重置左边view
///
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);
}
}
}
}
///
/// 垂直方向滚动视图
///
class MyUIDrawerLayout : UIView
{
public bool IsDrawerOpen = false;
public bool IsDrawerLockMode = false;
[Weak] internal UIDrawerLayout mUIDrawerLayout;
public MyUIDrawerLayout(UIDrawerLayout mUIDrawerLayout)
{
this.mUIDrawerLayout = mUIDrawerLayout;
}
///
/// 寻找最适合的View
/// 实现拦截
///
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);//不拦截
//}
}
///
/// 点击开始
///
/// Touches.
/// Evt.
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));
}
///
/// 移动
///
/// Touches.
/// Evt.
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));
}
///
/// 点击弹起
///
/// Touches.
/// Evt.
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));
}
///
/// 框架默认加了两个UIImageView ,这样可以去掉默认添加
///
/// View.
public override void AddSubview(UIView view)
{
if (view.GetType() == typeof(UIImageView) && view.Tag != int.MinValue)
{
return;
}
base.AddSubview(view);
}
}
///
/// 蒙层View
///
class MyMaskUIView : UIView
{
public MyMaskUIView()
{
}
///
/// 寻找最适合的View
/// 实现拦截
///
public override UIView HitTest(CGPoint point, UIEvent uievent)
{
return null;
}
}
}
}