using System;
using CoreGraphics;
using Foundation;
using UIKit;
namespace Shared
{
public class LongPressMoveVerticalScrolViewLayout:ViewGroup
{
///
/// 构造函数
///
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 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);
}
///
/// 根据点击位置找出点击到的视图
///
/// The view of point.
/// Point.
/// Uiview.
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;
}
///
/// 对换位置的两个视图
///
public Action ReplaceChanged;
///
/// 根据点击位置找出点击到的视图
///
/// 返回点击到的视图
/// 当前点击位置
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;
}
});
}
}
///
/// 是否允许滑动
///
/// true if scroll enabled; otherwise, false.
public bool ScrollEnabled
{
get
{
return (viewGroup as MyLongPressMoveVerticalScrolViewLayout).ScrollEnabled;
}
set
{
(viewGroup as MyLongPressMoveVerticalScrolViewLayout).ScrollEnabled = value;
}
}
///
/// 是否正在滑动
///
/// true if decelerating; otherwise, false.
public bool Decelerating
{
get
{
return (viewGroup as MyLongPressMoveVerticalScrolViewLayout).Decelerating;
}
}
///
/// 滑动事件
///
public EventHandler ScrolledEventHandler;
///
/// 垂直方向滚动视图
///
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 });
};
}
///
/// 点击开始
///
/// Touches.
/// Evt.
public override void TouchesBegan(NSSet touches, UIEvent evt)
{
view?.TouchEvent(EventActions.Down, (touches.AnyObject as UITouch).LocationInView(this));
}
///
/// 移动
///
/// Touches.
/// Evt.
public override void TouchesMoved(NSSet touches, UIEvent evt)
{
view?.TouchEvent(EventActions.Move, (touches.AnyObject as UITouch).LocationInView(this));
}
///
/// 点击弹起
///
/// Touches.
/// Evt.
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));
}
///
/// 框架默认加了两个UIImageView ,这样可以去掉默认添加
///
/// View.
public override void AddSubview(UIView view)
{
if (view.GetType() == typeof(UIImageView) && view.Tag != int.MinValue)
{
return;
}
base.AddSubview(view);
}
}
}
}