using System;
using UIKit;
using CoreGraphics;
using Shared.IO;
using Foundation;
namespace Shared
{
///
/// 在滑动事件下,可显示隐藏些自定义视图
///
public class RowLayout : ViewGroup
{
///
/// OpenMenuAction
///
public Action OpenMenuAction;
///
/// 右边的视图列表
///
internal System.Collections.Generic.List leftView = new System.Collections.Generic.List();
///
/// 右边的视图列表
///
internal System.Collections.Generic.List rigthView = new System.Collections.Generic.List();
///
/// 下面那边张
///
UIView lineUIView = new UIView();
///
/// 重新刷新控件
///
public override void Refresh()
{
base.Refresh();
LineColor = lineColor;
}
///
/// 控件宽度
///
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;
}
}
///
/// 子视图的宽度
///
public int SubViewWidth = 70;
///
/// 控件的高度
///
/// The height.
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;
///
/// 背景颜色
///
/// The color of the background.
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);
}
}
///
/// 是否正打开
///
//public bool IsOpening;
public bool IsShowLeft;
public bool IsShowRight;
///
/// 关闭其他RowLayout 显示的View
///
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
{
}
}
///
/// 关闭显示的View
///
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);
}
///
/// 是否使用同样的SubViewWidth宽
///
bool isUseSameSubViewWidth = true;
public bool IsUseSameSubViewWidth
{
get
{
return isUseSameSubViewWidth;
}
set
{
isUseSameSubViewWidth = value;
}
}
///
/// 获取当前leftView的总宽
///
///
int GetAllLeftViewWidth() {
int mWidth = 0;
foreach (var mView in leftView)
{
mWidth += mView.Width;
}
return mWidth;
}
///
/// 获取当前rigthView的总宽
///
///
int GetAllRightViewWidth()
{
int mWidth = 0;
foreach (var mView in rigthView)
{
mWidth += mView.Width;
}
return mWidth;
}
///
/// 增加左边视图
///
/// View.
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();
}
///
/// 增加右边视图
///
/// View.
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;
///
/// 在滑动事件下,可显示隐藏些自定义视图
///
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();
}
}
///
/// 垂直方向滚动视图
///
class MyRowLayout : UIView
{
[Weak] internal RowLayout rowLayout;
public MyRowLayout(RowLayout rowLayout)
{
this.rowLayout = rowLayout;
}
///
/// 点击开始
///
/// Touches.
/// Evt.
public override void TouchesBegan(NSSet touches, UIEvent evt)
{
rowLayout?.TouchEvent(EventActions.Down, (touches.AnyObject as UITouch).LocationInView(this));
}
///
/// 移动
///
/// Touches.
/// Evt.
public override void TouchesMoved(NSSet touches, UIEvent evt)
{
rowLayout?.TouchEvent(EventActions.Move, (touches.AnyObject as UITouch).LocationInView(this));
}
///
/// 点击弹起
///
/// Touches.
/// Evt.
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));
}
///
/// 框架默认加了两个UIImageView ,这样可以去掉默认添加
///
/// View.
public override void AddSubview(UIView view)
{
if (view.GetType() == typeof(UIImageView) && view.Tag != int.MinValue)
{
return;
}
base.AddSubview(view);
}
}
}
}