using System;
|
using CoreGraphics;
|
using Foundation;
|
using UIKit;
|
|
namespace Shared
|
{
|
public class LongPressMoveVerticalScrolViewLayout:ViewGroup
|
{
|
/// <summary>
|
/// 构造函数
|
/// </summary>
|
public LongPressMoveVerticalScrolViewLayout()
|
{
|
viewGroup = new MyLongPressMoveVerticalScrolViewLayout(this);
|
realViewGroup = viewGroup;
|
viewGroup.AddGestureRecognizer(new MyUILongPressGestureRecognizer(sender =>
|
{
|
(sender as MyUILongPressGestureRecognizer).longPressMoveVerticalScrolViewLayout?.uiViewLongPressed(sender);
|
})
|
{ longPressMoveVerticalScrolViewLayout = this });
|
}
|
|
class MyUILongPressGestureRecognizer : UILongPressGestureRecognizer {
|
[Weak] internal LongPressMoveVerticalScrolViewLayout longPressMoveVerticalScrolViewLayout;
|
public MyUILongPressGestureRecognizer(Action<UILongPressGestureRecognizer> action):base(action) {
|
|
}
|
}
|
|
public override void AddChidren(View view)
|
{
|
base.AddChidren(view);
|
int maxHeight = 0;
|
foreach (View tempView in viewList)
|
{
|
if (maxHeight < tempView.Bottom)
|
{
|
maxHeight = tempView.Bottom;
|
}
|
}
|
(realViewGroup as MyLongPressMoveVerticalScrolViewLayout).ContentSize = new CGSize(Width, maxHeight);
|
}
|
|
/// <summary>
|
/// 根据点击位置找出点击到的视图
|
/// </summary>
|
/// <returns>The view of point.</returns>
|
/// <param name="point">Point.</param>
|
/// <param name="uiview">Uiview.</param>
|
UIView replaceUIViewOfPoint(CGPoint point, UIView uiview)
|
{
|
//第一个是背景图
|
for (int i = 1; i < realViewGroup.Subviews.Length; i++)
|
{
|
var tempUIView = realViewGroup.Subviews[i];
|
if (tempUIView != uiview)
|
{
|
if (tempUIView.Frame.Contains(point))
|
{
|
return tempUIView;
|
}
|
}
|
}
|
return null;
|
}
|
|
/// <summary>
|
/// 对换位置的两个视图
|
/// </summary>
|
public Action<View,View> ReplaceChanged;
|
|
/// <summary>
|
/// 根据点击位置找出点击到的视图
|
/// </summary>
|
/// <returns>返回点击到的视图</returns>
|
/// <param name="point">当前点击位置</param>
|
UIView selectedUIViewOfPoint(CGPoint point)
|
{
|
foreach (UIView uiView in realViewGroup.Subviews)
|
{
|
if (uiView.GetType() != typeof(UIImageView) && uiView.Frame.Contains(point))
|
{
|
return uiView;
|
}
|
}
|
return null;
|
}
|
|
|
CGPoint originPoint;
|
bool contain;
|
UIView selectedUIView;
|
void uiViewLongPressed(UILongPressGestureRecognizer sender)
|
{
|
//长按开始
|
if (sender.State == UIGestureRecognizerState.Began)
|
{
|
//找出当前点击位置的视图
|
selectedUIView = selectedUIViewOfPoint(sender.LocationInView(sender.View));
|
if (selectedUIView == null)
|
{
|
return;
|
}
|
originPoint = selectedUIView.Center;
|
UIView.Animate(1.0f, () =>
|
{
|
selectedUIView.Transform = CGAffineTransform.MakeScale(1.1f, 1.1f);
|
selectedUIView.Alpha = 0.7f;
|
});
|
}
|
else if (sender.State == UIGestureRecognizerState.Changed)
|
{
|
if (selectedUIView == null)
|
{
|
return;
|
}
|
//移动当前视图
|
selectedUIView.Center = sender.LocationInView(sender.View);
|
//获取当前视图进入了哪个视图的区域
|
var replaceUIView = replaceUIViewOfPoint(selectedUIView.Center, selectedUIView);
|
if (replaceUIView ==null)
|
{
|
contain = false;
|
}
|
else
|
{
|
//进入区域后切换位置
|
UIView.Animate(1.0f, () =>
|
{
|
var temp = replaceUIView.Center;
|
replaceUIView.Center = originPoint;
|
selectedUIView.Center = temp;
|
originPoint = selectedUIView.Center;
|
contain = true;
|
}, () =>
|
{
|
View selectedView = null;
|
foreach (View view in viewList)
|
{
|
if (view.RealView == selectedUIView)
|
{
|
selectedView = view;
|
break;
|
}
|
}
|
View replaceView = null;
|
foreach (View view in viewList)
|
{
|
if (view.RealView == replaceUIView)
|
{
|
replaceView = view;
|
break;
|
}
|
}
|
if(ReplaceChanged!=null){
|
ReplaceChanged(selectedView, replaceView);
|
}
|
|
});
|
}
|
}
|
else if (sender.State == UIGestureRecognizerState.Ended)
|
{
|
if (selectedUIView == null)
|
{
|
return;
|
}
|
UIView.Animate(1.0f, () =>
|
{
|
selectedUIView.Transform = CGAffineTransform.MakeIdentity();
|
selectedUIView.Alpha = 1.0f;
|
//如果不需要移动位置
|
if (!contain)
|
{
|
selectedUIView.Center = originPoint;
|
}
|
});
|
}
|
}
|
|
/// <summary>
|
/// 是否允许滑动
|
/// </summary>
|
/// <value><c>true</c> if scroll enabled; otherwise, <c>false</c>.</value>
|
public bool ScrollEnabled
|
{
|
get
|
{
|
return (viewGroup as MyLongPressMoveVerticalScrolViewLayout).ScrollEnabled;
|
}
|
set
|
{
|
(viewGroup as MyLongPressMoveVerticalScrolViewLayout).ScrollEnabled = value;
|
}
|
}
|
|
/// <summary>
|
/// 是否正在滑动
|
/// </summary>
|
/// <value><c>true</c> if decelerating; otherwise, <c>false</c>.</value>
|
public bool Decelerating
|
{
|
get
|
{
|
return (viewGroup as MyLongPressMoveVerticalScrolViewLayout).Decelerating;
|
}
|
}
|
|
/// <summary>
|
/// 滑动事件
|
/// </summary>
|
public EventHandler<MouseEventArgs> ScrolledEventHandler;
|
|
/// <summary>
|
/// 垂直方向滚动视图
|
/// </summary>
|
class MyLongPressMoveVerticalScrolViewLayout : UIScrollView
|
{
|
[Weak] LongPressMoveVerticalScrolViewLayout view;
|
public MyLongPressMoveVerticalScrolViewLayout(LongPressMoveVerticalScrolViewLayout view)
|
{
|
this.view = view;
|
|
Scrolled += (sender, e) =>
|
{
|
this.view?.ScrolledEventHandler?.Invoke(this, new MouseEventArgs { X = (float)(sender as MyLongPressMoveVerticalScrolViewLayout).ContentOffset.X, Y = (float)(sender as MyLongPressMoveVerticalScrolViewLayout).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);
|
}
|
}
|
}
|
}
|