using System; using UIKit; using Shared.IO; using CoreGraphics; using Foundation; namespace Shared { /// /// 位置布局 /// public class PageLayout : ViewGroup { readonly MyPageLayout iosUIScrolView; readonly UIPageControl iosUIPageControl; /// /// 页面变化事件 /// public Action PageChange; /// /// 垂直方向滚动视图 /// class MyPageLayout : UIScrollView { [Weak] PageLayout pageLayout; public MyPageLayout(PageLayout pageLayout) { this.pageLayout = pageLayout; DecelerationEnded += (s, e) => { var tempUIScrolView = s as MyPageLayout; //获取当前界面的索引 var tempPageIndex = Convert.ToInt32(tempUIScrolView.ContentOffset.X / tempUIScrolView.Frame.Width); //通知界面索引变化 if (this.pageLayout.pageIndex != tempPageIndex) { this.pageLayout.pageIndex = tempPageIndex; this.pageLayout.iosUIPageControl.CurrentPage = tempPageIndex; this.pageLayout.PageChange?.Invoke(this.pageLayout, this.pageLayout.pageIndex); } }; } /// /// 点击开始 /// /// Touches. /// Evt. public override void TouchesBegan(NSSet touches, UIEvent evt) { pageLayout?.TouchEvent(EventActions.Down, (touches.AnyObject as UITouch).LocationInView(this)); } /// /// 移动 /// /// Touches. /// Evt. public override void TouchesMoved(NSSet touches, UIEvent evt) { pageLayout?.TouchEvent(EventActions.Move, (touches.AnyObject as UITouch).LocationInView(this)); } /// /// 点击弹起 /// /// Touches. /// Evt. public override void TouchesEnded(NSSet touches, UIEvent evt) { pageLayout?.TouchEvent(EventActions.Up, (touches.AnyObject as UITouch).LocationInView(this)); } public override void TouchesCancelled(NSSet touches, UIEvent evt) { pageLayout?.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; } if (view.ToString().Contains("UIScrollViewScrollIndicator")) { return; } base.AddSubview(view); } } /// /// 构造函数 /// public PageLayout() { viewGroup = new UIView(); iosUIPageControl = new UIPageControl { Enabled = false }; iosUIScrolView = new MyPageLayout(this) { }; realViewGroup = iosUIScrolView; var frame = iosUIPageControl.Frame; frame.Height = 16; iosUIPageControl.Frame = frame; //启动翻页功能 iosUIScrolView.PagingEnabled = true; iosUIScrolView.Bounces = false; iosUIScrolView.ShowsHorizontalScrollIndicator = false; viewGroup.AddSubview(iosUIScrolView); viewGroup.AddSubview(iosUIPageControl); } /// /// 是否显示下面一排的点 /// /// true if is show point; otherwise, false. public bool IsShowPoint { get { return !iosUIPageControl.Hidden; } set { iosUIPageControl.Hidden = !value; } } /// /// 是否允许滑动 /// /// true if scroll enabled; otherwise, false. public bool ScrollEnabled { get { return (iosUIScrolView as MyPageLayout).ScrollEnabled; } set { (iosUIScrolView as MyPageLayout).ScrollEnabled = value; } } int pageIndex; /// /// 设置或者获取当前的界面索引 /// /// The index of the page. public int PageIndex { get { return pageIndex; } set { if (value < 0 || ChildrenCount <= value) { return; } int beforePageIndex = pageIndex; pageIndex = value; if (!IsCanRefresh) { return; } var viewSize = iosUIScrolView.Frame.Size; var rect = new CGRect(pageIndex * viewSize.Width, 0, viewSize.Width, viewSize.Height); iosUIScrolView.ScrollRectToVisible(rect, false); if (beforePageIndex != pageIndex) { iosUIPageControl.CurrentPage = pageIndex; PageChange?.Invoke(this, pageIndex); } } } /// /// 增加子控件 /// /// View. public override void AddChidren(View view) { //var v = Application.AverageScale; //var vv = Application.CurrentHeight; //var dddd = Application.DesignWidth; base.AddChidren(view); iosUIPageControl.Pages = ChildrenCount; ReLocation(); } /// /// 重新排位置及设备内容大小 /// public virtual void ReLocation() { if (iosUIScrolView.Subviews.Length == 0) { return; } for (int i = 1; i < iosUIScrolView.Subviews.Length; i++) { var frame = iosUIScrolView.Subviews[i].Frame; frame.X = iosUIScrolView.Subviews[i - 1].Frame.Right; iosUIScrolView.Subviews[i].Frame = frame; } iosUIScrolView.ContentSize = new CoreGraphics.CGSize(iosUIScrolView.Subviews[iosUIScrolView.Subviews.Length - 1].Frame.Right, iosUIScrolView.Frame.Height); } /// /// 控件宽度 /// /// The width. public override int Width { get { return base.Width; } set { base.Width = value; if (!IsCanRefresh) return; var frame = iosUIPageControl.Frame; frame.Width = Width; iosUIPageControl.Frame = frame; } } /// /// 控件的高度 /// /// The height. public override int Height { get { return base.Height; } set { base.Height = value; if (!IsCanRefresh) return; var frame = iosUIPageControl.Frame; frame.Y = Height - frame.Height; iosUIPageControl.Frame = frame; } } /// /// 移除当前控件 /// /// View. internal override void Remove(View view) { base.Remove(view); ReLocation(); PageIndex = ChildrenCount - 1; iosUIPageControl.Pages = ChildrenCount; iosUIPageControl.CurrentPage = PageIndex; } /// /// 移除所有的控件 /// public override void RemoveAll() { base.RemoveAll(); ReLocation(); iosUIPageControl.Pages = 0; PageIndex = 0; iosUIPageControl.CurrentPage = 0; } /// /// 根据索引移除控件 /// /// Index. public override void RemoveAt(int index) { Remove(viewList[index]); } } }