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); } } } }