using System;
|
using UIKit;
|
using CoreGraphics;
|
using Shared.IO;
|
using Foundation;
|
using MJRefresh;
|
|
namespace Shared
|
{
|
/// <summary>
|
/// 位置布局 带下拉刷新
|
/// </summary>
|
public class VerticalRefreshLayout : ViewGroup
|
{
|
|
public Action BeginHeaderRefreshingAction;
|
//public Action BeginFooterRefreshingAction;
|
MyRefreshScrolViewLayout mUIScrollView;
|
|
public VerticalRefreshLayout()
|
{
|
mUIScrollView = new MyRefreshScrolViewLayout(this) { };
|
|
viewGroup = mUIScrollView;
|
|
realViewGroup = mUIScrollView;
|
|
_isCanHeaderRefresh = true;
|
|
MJRefreshNormalHeader header = new MJRefreshNormalHeader();
|
//隐藏提示文字
|
header.LastUpdatedTimeLabel.Hidden = true;
|
//header.StateLabel.Hidden = true;
|
|
mUIScrollView.SetMj_header(header);
|
|
header.RefreshingBlock = () =>
|
{
|
BeginHeaderRefreshingAction?.Invoke();
|
};
|
|
|
|
//header.SetTitle(NSBundle_MJRefresh.Mj_localizedStringForKey(NSBundle_MJRefresh.Mj_refreshBundle(NSBundle.MainBundle), "MJRefreshHeaderIdleText"), MJRefreshState.Idle);
|
//header.SetTitle(NSBundle_MJRefresh.Mj_localizedStringForKey(NSBundle_MJRefresh.Mj_refreshBundle(NSBundle.MainBundle), "MJRefreshHeaderPullingText"), MJRefreshState.Pulling);
|
//header.SetTitle(NSBundle_MJRefresh.Mj_localizedStringForKey(NSBundle_MJRefresh.Mj_refreshBundle(NSBundle.MainBundle), "MJRefreshHeaderRefreshingText"), MJRefreshState.Refreshing);
|
|
//header.AutomaticallyChangeAlpha = true;
|
|
|
}
|
|
//private void AddFotterView() {
|
|
// MJRefreshAutoNormalFooter footer = new MJRefreshAutoNormalFooter();
|
// mUIScrollView.SetMj_footer(footer);
|
|
// footer.RefreshingBlock = async () =>
|
// {
|
// BeginFooterRefreshingAction?.Invoke();
|
// };
|
|
//}
|
|
|
|
//***************************下拉刷新***************************
|
/// <summary>
/// 是否支持下拉刷新
/// </summary>
|
bool _isCanHeaderRefresh;
|
private bool IsCanHeaderRefresh
|
{
|
get
{
return _isCanHeaderRefresh;
}
|
set
|
{
|
_isCanHeaderRefresh = value;
|
|
}
|
}
|
|
|
/// <summary>
/// 头开始刷新
/// </summary>
|
public void BeginHeaderRefreshing()
|
{
|
if (!IsCanHeaderRefresh) return;
|
|
|
if (!mUIScrollView.Mj_header().Refreshing)
|
{
|
mUIScrollView.Mj_header().BeginRefreshing();
|
}
|
}
|
|
/// <summary>
/// 头结束刷新
/// </summary>
|
public void EndHeaderRefreshing()
|
{
|
if (!IsCanHeaderRefresh) return;
|
|
if (mUIScrollView.Mj_header().Refreshing)
|
{
|
mUIScrollView.Mj_header().EndRefreshing();
|
}
|
}
|
|
|
/// <summary>
/// 是否显示滚动条
/// </summary>
|
|
public bool VerticalScrollBarEnabled
|
{
|
get
{
return mUIScrollView.ShowsVerticalScrollIndicator;
}
|
set
|
{
|
mUIScrollView.ShowsVerticalScrollIndicator = value;
|
|
}
|
}
|
|
|
|
/// <summary>
|
/// 垂直方向滚动视图
|
/// </summary>
|
class MyRefreshScrolViewLayout : UIScrollView
|
{
|
[Weak] VerticalRefreshLayout _view;
|
public MyRefreshScrolViewLayout(VerticalRefreshLayout view)
|
{
|
this._view = view;
|
Scrolled += (sender, e) =>
|
{
|
this._view?.ScrolledEventHandler?.Invoke(this, new MouseEventArgs { X = (float)(sender as MyRefreshScrolViewLayout).ContentOffset.X, Y = (float)(sender as MyRefreshScrolViewLayout).ContentOffset.Y });
|
};
|
}
|
/// <summary>
|
/// 点击开始
|
/// </summary>
|
/// <param name="touches">Touches.</param>
|
/// <param name="evt">Evt.</param>
|
public override void TouchesBegan(NSSet touches, UIEvent evt)
|
{
|
_view?.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)
|
{
|
_view?.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)
|
{
|
_view?.TouchEvent(EventActions.Up, (touches.AnyObject as UITouch).LocationInView(this));
|
}
|
|
public override void TouchesCancelled(NSSet touches, UIEvent evt)
|
{
|
_view?.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);
|
}
|
}
|
|
/// <summary>
|
/// 增加控件
|
/// </summary>
|
/// <param name="view">子控件</param>
|
public override void AddChidren(View view)
|
{
|
base.AddChidren(view);
|
ReLocation();
|
}
|
|
/// <summary>
|
/// 重新排位置及设备内容大小
|
/// </summary>
|
public virtual void ReLocation()
|
{
|
if (0 == viewList.Count)
|
{
|
return;
|
}
|
var frame1 = viewList[0].RealView.Frame;
|
frame1.Y = 0;
|
viewList[0].RealView.Frame = frame1;
|
|
for (int i = 1; i < viewList.Count; i++)
|
{
|
var frame = viewList[i].RealView.Frame;
|
frame.Y = viewList[i - 1].RealView.Frame.Bottom;
|
viewList[i].RealView.Frame = frame;
|
}
|
|
(realViewGroup as MyRefreshScrolViewLayout).ContentSize = new CoreGraphics.CGSize(0, viewList[viewList.Count - 1].Bottom <= Height ? Height + 1 : viewList[viewList.Count - 1].Bottom);
|
}
|
|
/// <summary>
|
/// 移除所有的视图
|
/// </summary>
|
public override void RemoveAll()
|
{
|
base.RemoveAll();
|
|
ReLocation();
|
}
|
|
/// <summary>
|
/// 移除当前视图
|
/// </summary>
|
/// <param name="view">当前视图</param>
|
internal override void Remove(View view)
|
{
|
base.Remove(view);
|
|
ReLocation();
|
}
|
|
/// <summary>
|
/// 移除指定索引
|
/// </summary>
|
/// <param name="index">索引</param>
|
public override void RemoveAt(int index)
|
{
|
base.RemoveAt(index);
|
ReLocation();
|
}
|
|
///// <summary>
|
///// 是否允许滑动
|
///// </summary>
|
///// <value><c>true</c> if scroll enabled; otherwise, <c>false</c>.</value>
|
//public bool ScrollEnabled
|
//{
|
// get
|
// {
|
// return (realViewGroup as MyRefreshScrolViewLayout).ScrollEnabled;
|
// }
|
// set
|
// {
|
// (realViewGroup as MyRefreshScrolViewLayout).ScrollEnabled = value;
|
// }
|
//}
|
|
///// <summary>
|
///// 是否正在滑动
|
///// </summary>
|
///// <value><c>true</c> if decelerating; otherwise, <c>false</c>.</value>
|
//public bool Decelerating
|
//{
|
// get
|
// {
|
// return (realViewGroup as MyRefreshScrolViewLayout).Decelerating;
|
// }
|
//}
|
|
/// <summary>
|
/// 滑动事件
|
/// </summary>
|
public EventHandler<MouseEventArgs> ScrolledEventHandler;
|
|
|
}
|
}
|