using System;
|
using UIKit;
|
using CoreGraphics;
|
using Shared.IO;
|
using Foundation;
|
|
namespace Shared
|
{
|
/// <summary>
|
/// 在滑动事件下,可显示隐藏些自定义视图
|
/// </summary>
|
public class RowLayout : ViewGroup
|
{
|
/// <summary>
|
/// OpenMenuAction
|
/// </summary>
|
public Action OpenMenuAction;
|
|
/// <summary>
|
/// 右边的视图列表
|
/// </summary>
|
internal System.Collections.Generic.List<Button> leftView = new System.Collections.Generic.List<Button>();
|
/// <summary>
|
/// 右边的视图列表
|
/// </summary>
|
internal System.Collections.Generic.List<Button> rigthView = new System.Collections.Generic.List<Button>();
|
/// <summary>
|
/// 下面那边张
|
/// </summary>
|
UIView lineUIView = new UIView();
|
|
/// <summary>
|
/// 重新刷新控件
|
/// </summary>
|
public override void Refresh()
|
{
|
base.Refresh();
|
LineColor = lineColor;
|
}
|
/// <summary>
|
/// 控件宽度
|
/// </summary>
|
public override int Width
|
{
|
get
|
{
|
return base.Width;
|
}
|
set
|
{
|
base.Width = value;
|
if (!IsCanRefresh)
|
return;
|
|
var frame4 = lineUIView.Frame;
|
frame4.Width = base.Width;
|
lineUIView.Frame = frame4;
|
}
|
}
|
|
/// <summary>
|
/// 子视图的宽度
|
/// </summary>
|
public int SubViewWidth = 70;
|
|
/// <summary>
|
/// 控件的高度
|
/// </summary>
|
/// <value>The height.</value>
|
public override int Height
|
{
|
get
|
{
|
return base.Height;
|
}
|
set
|
{
|
base.Height = value;
|
if (!IsCanRefresh)
|
return;
|
|
{
|
var frame = realViewGroup.Frame;
|
frame.Height = Height;
|
realViewGroup.Frame = frame;
|
}
|
|
var frame4 = lineUIView.Frame;
|
frame4.Y = base.Height - frame4.Height;
|
lineUIView.Frame = frame4;
|
}
|
}
|
|
uint lineColor = 0x80818181;
|
/// <summary>
|
/// 背景颜色
|
/// </summary>
|
/// <value>The color of the background.</value>
|
public virtual uint LineColor
|
{
|
get
|
{
|
return lineColor;
|
}
|
set
|
{
|
lineColor = value;
|
if (!IsCanRefresh)
|
{
|
return;
|
}
|
byte r, g, b, a;
|
r = (byte)(lineColor / 256 / 256 % 256);
|
g = (byte)(lineColor / 256 % 256);
|
b = (byte)(lineColor % 256);
|
a = (byte)(lineColor / 256 / 256 / 256 % 256);
|
lineUIView.BackgroundColor = UIKit.UIColor.FromRGBA(r, g, b, a);
|
}
|
}
|
|
/// <summary>
|
/// 是否正打开
|
/// </summary>
|
//public bool IsOpening;
|
public bool IsShowLeft;
|
public bool IsShowRight;
|
|
/// <summary>
|
/// 关闭其他RowLayout 显示的View
|
/// </summary>
|
private void HideOtherRowLayout()
|
{
|
try
|
{
|
if (this.Parent != null)
|
{
|
foreach (View mView in Parent.viewList)
|
{
|
if (mView is RowLayout && mView != this)
|
{
|
|
if ((mView as RowLayout).IsShowRight || (mView as RowLayout).IsShowLeft)
|
{
|
(mView as RowLayout).HideMenu();
|
}
|
}
|
}
|
|
}
|
}
|
catch
|
{
|
}
|
}
|
|
/// <summary>
|
/// 关闭显示的View
|
/// </summary>
|
public void HideMenu()
|
{
|
if (IsShowLeft)
|
{
|
HideLeftMenu();
|
}
|
if (IsShowRight)
|
{
|
HideRightMenu();
|
}
|
|
}
|
|
public void OpenLeftMenu()
|
{
|
HideOtherRowLayout();
|
if (IsShowRight)
|
{
|
HideRightMenu();
|
return;
|
}
|
|
if (leftView.Count == 0)
|
return;
|
|
|
IsShowLeft = true;
|
(viewGroup as UIScrollView).SetContentOffset(new CGPoint(leftView[0].RealView.Frame.X, 0), true);
|
OpenMenuAction?.Invoke();
|
}
|
|
public void HideLeftMenu()
|
{
|
IsShowLeft = false;
|
HideAllMenuView();
|
}
|
|
public void OpenRightMenu()
|
{
|
HideOtherRowLayout();
|
if (IsShowLeft)
|
{
|
HideLeftMenu();
|
return;
|
}
|
if (rigthView.Count == 0)
|
return;
|
IsShowRight = true;
|
var rigthViewX = realViewGroup.Frame.X + GetAllRightViewWidth();
|
(viewGroup as UIScrollView).SetContentOffset(new CGPoint(rigthViewX, 0), true);
|
OpenMenuAction?.Invoke();
|
|
}
|
|
public void HideRightMenu()
|
{
|
IsShowRight = false;
|
|
HideAllMenuView();
|
}
|
|
void RestMenuView() {
|
if (IsShowRight)
|
{
|
OpenRightMenu();
|
}
|
else if (IsShowLeft)
|
{
|
OpenLeftMenu();
|
|
}
|
else {
|
HideAllMenuView();
|
}
|
|
}
|
|
void HideAllMenuView()
|
{
|
(viewGroup as UIScrollView).SetContentOffset(new CGPoint(realViewGroup.Frame.X, 0), true);
|
}
|
|
/// <summary>
|
/// 是否使用同样的SubViewWidth宽
|
/// </summary>
|
bool isUseSameSubViewWidth = true;
|
public bool IsUseSameSubViewWidth
|
{
|
get
|
{
|
return isUseSameSubViewWidth;
|
|
}
|
set
|
{
|
isUseSameSubViewWidth = value;
|
}
|
|
}
|
|
/// <summary>
|
/// 获取当前leftView的总宽
|
/// </summary>
|
/// <returns></returns>
|
int GetAllLeftViewWidth() {
|
int mWidth = 0;
|
foreach (var mView in leftView)
|
{
|
mWidth += mView.Width;
|
}
|
return mWidth;
|
}
|
|
/// <summary>
|
/// 获取当前rigthView的总宽
|
/// </summary>
|
/// <returns></returns>
|
int GetAllRightViewWidth()
|
{
|
int mWidth = 0;
|
foreach (var mView in rigthView)
|
{
|
mWidth += mView.Width;
|
}
|
return mWidth;
|
}
|
|
|
/// <summary>
|
/// 增加左边视图
|
/// </summary>
|
/// <param name="view">View.</param>
|
public void AddLeftView(Button view)
|
{
|
if (null == view)
|
{
|
return;
|
}
|
|
var mSubViewWidth = isUseSameSubViewWidth ? SubViewWidth : view.Width;
|
|
view.X = GetAllLeftViewWidth();
|
view.Y = 0;
|
view.Width = mSubViewWidth;
|
view.Height = Height;
|
viewGroup.AddSubview(view.RealView);
|
view.Parent = this;
|
view.Refresh();
|
leftView.Add(view);
|
var frame = realViewGroup.Frame;
|
frame.X += mSubViewWidth;
|
realViewGroup.Frame = frame;
|
foreach (var right in rigthView)
|
{
|
right.X += mSubViewWidth;
|
}
|
|
RefreshContentSize();
|
}
|
|
void RefreshContentSize() {
|
var menuWidth = GetAllLeftViewWidth() + GetAllRightViewWidth();
|
(viewGroup as UIScrollView).ContentSize = new CoreGraphics.CGSize(menuWidth + realViewGroup.Frame.Width, 0);
|
(viewGroup as UIScrollView).SetContentOffset(new CGPoint(realViewGroup.Frame.X, 0), false);
|
}
|
|
internal override void removeChildParent()
|
{
|
foreach (var tempView in leftView)
|
{
|
tempView.Parent = null;
|
}
|
foreach (var tempView in rigthView)
|
{
|
tempView.Parent = null;
|
}
|
base.removeChildParent();
|
}
|
|
/// <summary>
|
/// 增加右边视图
|
/// </summary>
|
/// <param name="view">View.</param>
|
public void AddRightView(Button view)
|
{
|
if (null == view)
|
{
|
return;
|
}
|
var mSubViewWidth = isUseSameSubViewWidth ? SubViewWidth : view.Width;
|
|
view.X =(int)realViewGroup.Frame.Right + GetAllRightViewWidth();
|
view.Y = 0;
|
view.Width = mSubViewWidth;
|
view.Height = Height;
|
viewGroup.AddSubview(view.RealView);
|
view.Parent = this;
|
view.Refresh();
|
rigthView.Add(view);
|
|
RefreshContentSize();
|
}
|
|
nfloat beforeXScrollX;
|
nfloat moveX;
|
/// <summary>
|
/// 在滑动事件下,可显示隐藏些自定义视图
|
/// </summary>
|
public RowLayout()
|
{
|
viewGroup = new UIScrollView { Bounces = false };
|
realViewGroup = new MyRowLayout(this) { };
|
|
viewGroup.AddSubview(realViewGroup);
|
viewGroup.Layer.MasksToBounds = true;
|
|
lineUIView.BackgroundColor = new UIColor(0x81 / 255.0f, 0x81 / 255.0f, 0x81 / 255.0f, 0.8f);
|
var lineUIViewFrame = lineUIView.Frame;
|
lineUIViewFrame.Height = 1.0f;
|
lineUIView.Frame = lineUIViewFrame;
|
viewGroup.AddSubview(lineUIView);
|
|
(viewGroup as UIScrollView).ShowsHorizontalScrollIndicator = false;//隐藏水平滚动条
|
|
|
(viewGroup as UIScrollView).Scrolled += (s, e) =>
|
{
|
moveX = (viewGroup as UIScrollView).ContentOffset.X - beforeXScrollX;
|
};
|
|
(viewGroup as UIScrollView).DraggingStarted += (sender, e) =>
|
{
|
beforeXScrollX = (viewGroup as UIScrollView).ContentOffset.X;
|
};
|
|
(viewGroup as UIScrollView). DecelerationStarted += (s, e) =>
|
{
|
|
GetMovePageIndex();
|
|
};
|
|
|
|
(viewGroup as UIScrollView).DraggingEnded += (s, e) =>
|
{
|
if (!e.Decelerate)
|
{
|
GetMovePageIndex();
|
}
|
};
|
|
}
|
|
void GetMovePageIndex(){
|
|
if (20 < Math.Abs(moveX))
|
{
|
if (moveX < 0)
|
{
|
OpenLeftMenu();
|
}
|
else if (moveX > 0)
|
{
|
OpenRightMenu();
|
}
|
}
|
else
|
{
|
RestMenuView();
|
}
|
}
|
|
|
/// <summary>
|
/// 垂直方向滚动视图
|
/// </summary>
|
class MyRowLayout : UIView
|
{
|
[Weak] internal RowLayout rowLayout;
|
public MyRowLayout(RowLayout rowLayout)
|
{
|
this.rowLayout = rowLayout;
|
}
|
/// <summary>
|
/// 点击开始
|
/// </summary>
|
/// <param name="touches">Touches.</param>
|
/// <param name="evt">Evt.</param>
|
public override void TouchesBegan(NSSet touches, UIEvent evt)
|
{
|
rowLayout?.TouchEvent(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)
|
{
|
rowLayout?.TouchEvent(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)
|
{
|
rowLayout?.TouchEvent(EventActions.Up, (touches.AnyObject as UITouch).LocationInView(this));
|
}
|
|
public override void TouchesCancelled(NSSet touches, UIEvent evt)
|
{
|
rowLayout?.TouchEvent(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);
|
}
|
}
|
}
|
}
|