using System; using System.Collections.Generic; using System.Text; namespace Shared.Phone { /// /// 做成一个里面只装FrameLayout的列表型控件(它不会调整高度,有桌布) /// public class VerticalFrameControl : VerticalScrolViewLayout { #region ■ 变量声明___________________________ /// /// 行之间的间距 /// public int rowSpace = 0; /// /// 桌布控件 /// private NormalFrameLayout m_frameTable = null; /// /// 桌布控件(这个东西不能删,因为有些界面需要他的桌布) /// public NormalFrameLayout frameTable { get { if (m_frameTable == null) { this.InitFrameTable(); } return m_frameTable; } } /// /// 一个临时的东西 /// private FrameLayout frameBackTemp = null; #endregion #region ■ 初始化_____________________________ /// /// 做成一个列表型的FrameLayout(它不会调整高度) /// /// 行之间的间距(这个值是与行控件绑定一起使用的) public VerticalFrameControl(int i_rowSpace = 0) { rowSpace = Application.GetRealHeight(i_rowSpace); #if iOS //自动偏移取消 if (UIKit.UIDevice.CurrentDevice.CheckSystemVersion(11, 0)) { (this.uiView as UIKit.UIScrollView).ContentInsetAdjustmentBehavior = UIKit.UIScrollViewContentInsetAdjustmentBehavior.Never; } #endif } /// /// 初始化桌布控件 /// private void InitFrameTable() { if (this.m_frameTable != null && this.m_frameTable.Parent != null) { return; } this.m_frameTable = new NormalFrameLayout(); this.m_frameTable.Width = this.Width; this.m_frameTable.Height = this.Height; base.AddChidren(this.m_frameTable); } #endregion #region ■ 添加子控件_________________________ /// /// 添加Frame子控件(注意,它是往下加控件,只会改变坐标,桌布大小会增加) /// /// public override void AddChidren(View view) { //初始化桌布控件 this.InitFrameTable(); //获取坐标底部最下面的那个控件的底部坐标 int value = this.GetLocationMostLastViewBottom(this.frameTable); if (value != -1) { view.Y = value + rowSpace; } this.frameTable.AddChidren(view); //调整桌布高度 if (this.frameTable.Height < view.Bottom) { this.frameTable.Height = view.Bottom; } } #endregion #region ■ 一般方法___________________________ /// /// 调整子FrameLayout的高度(只扩大,不缩小) /// /// /// 底部空白间距(真实值) public void AdjustChidrenFrameHeight(FrameLayout frame, int buttomSpace) { //获取坐标底部最下面的那个控件的底部坐标 int value = this.GetLocationMostLastViewBottom(frame); if (value != -1) { //调整桌布高度 if (frame.Height < value + buttomSpace) { frame.Height = value + buttomSpace; } } } /// /// 调整子FrameLayout的真实高度 /// /// /// 最小高度 public void AdjustChidrenFrameRealHeight(FrameLayout frame, int minHeight = -1) { //获取坐标底部最下面的那个控件的底部坐标 int value = this.GetLocationMostLastViewBottom(frame); if (minHeight != -1 && value < minHeight) { //没有超过最小高度 return; } if (value != -1) { //调整桌布高度 frame.Height = value; } } /// /// 调整桌布高度 /// public void AdjustTableHeight() { //2020.05.25追加 if (this.frameBackTemp != null && this.frameBackTemp.Parent != null) { this.frameBackTemp.RemoveFromParent(); } //获取坐标底部最下面的那个控件的底部坐标 int value = this.GetLocationMostLastViewBottom(this.frameTable); if (value != -1) { //调整桌布高度 this.frameTable.Height = value; } else { //还原为原来的高度 this.RecoverTableHeight(); } } /// /// 针对底部点击按钮,调整控件真实高度 /// /// /// Y轴补正值(真实值,列表控件不在bodyFramelayout的时候使用) /// 一般为正数,如果为负数代表bodyFramelayout超出了顶部 /// public void AdjustRealHeightByBottomButton(int correctionsValue = 0) { //调整桌布高度 2020.05.25追加 this.AdjustTableHeight(); var btnTemp = new BottomClickButton(); if (btnTemp.Yaxis >= this.frameTable.Height + correctionsValue) { //没有超过 return; } //添加临时控件,直至可以滑动超过底部按钮 int oldRowSpace = this.rowSpace; this.rowSpace = 0; this.frameBackTemp = new FrameLayout(); frameBackTemp.Height = HdlControlResourse.BodyFrameHeight - btnTemp.Yaxis + Application.GetRealHeight(23); this.AddChidren(frameBackTemp); this.rowSpace = oldRowSpace; } /// /// 还原桌布高度 /// public void RecoverTableHeight() { if (this.m_frameTable != null) { m_frameTable.Height = this.Height; } } /// /// 获取坐标底部最下面的那个控件的底部坐标 /// /// private int GetLocationMostLastViewBottom(FrameLayout frame) { int bottomHeight = -1; if (frame == null) { return bottomHeight; } for (int i = 0; i < frame.ChildrenCount; i++) { var child = frame.GetChildren(i); if (child.Bottom > bottomHeight) { bottomHeight = child.Bottom; } } return bottomHeight; } #endregion } }