黄学彪
2020-09-22 ade5917841b0fdcb1df7353ef7c56b1a1bdc9282
ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/ListViewLayoutControls/VerticalFrameControl.cs
@@ -5,7 +5,7 @@
namespace Shared.Phone.UserCenter
{
    /// <summary>
    /// 做成一个里面只装FrameLayout的列表型控件(它不会调整高度)
    /// 做成一个里面只装FrameLayout的列表型控件(它不会调整高度,有桌布)
    /// </summary>
    public class VerticalFrameControl : VerticalScrolViewLayout
    {
@@ -18,7 +18,23 @@
        /// <summary>
        /// 桌布控件
        /// </summary>
        private FrameLayout frameTable = null;
        private NormalFrameLayout m_frameTable = null;
        /// <summary>
        /// 桌布控件(这个东西不能删,因为有些界面需要他的桌布)
        /// </summary>
        public NormalFrameLayout frameTable
        {
            get
            {
                if (m_frameTable == null) { this.InitFrameTable(); }
                return m_frameTable;
            }
        }
        /// <summary>
        /// 一个临时的东西
        /// </summary>
        private FrameLayout frameBackTemp = null;
        #endregion
@@ -31,6 +47,13 @@
        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
        }
        /// <summary>
@@ -38,14 +61,14 @@
        /// </summary>
        private void InitFrameTable()
        {
            if (this.frameTable != null)
            if (this.m_frameTable != null && this.m_frameTable.Parent != null)
            {
                return;
            }
            this.frameTable = new FrameLayout();
            this.frameTable.Width = this.Width;
            this.frameTable.Height = this.Height;
            this.AddChidren(this.frameTable);
            this.m_frameTable = new NormalFrameLayout();
            this.m_frameTable.Width = this.Width;
            this.m_frameTable.Height = this.Height;
            base.AddChidren(this.m_frameTable);
        }
        #endregion
@@ -53,24 +76,25 @@
        #region ■ 添加子控件_________________________
        /// <summary>
        /// 添加Frame子控件
        /// 添加Frame子控件(注意,它是往下加控件,只会改变坐标,桌布大小会增加)
        /// </summary>
        /// <param name="view"></param>
        public void AddChidrenFrame(FrameLayout frame)
        public override void AddChidren(View view)
        {
            //初始化桌布控件
            this.InitFrameTable();
            var child = this.frameTable.GetChildren(this.frameTable.ChildrenCount - 1);
            if (child != null)
            //获取坐标底部最下面的那个控件的底部坐标
            int value = this.GetLocationMostLastViewBottom(this.m_frameTable);
            if (value != -1)
            {
                frame.Y = child.Bottom + rowSpace;
                view.Y = value + rowSpace;
            }
            this.frameTable.AddChidren(frame);
            this.m_frameTable.AddChidren(view);
            //调整桌布高度
            if (this.frameTable.Height < frame.Bottom)
            if (this.m_frameTable.Height < view.Bottom)
            {
                this.frameTable.Height = frame.Bottom;
                this.m_frameTable.Height = view.Bottom;
            }
        }
@@ -79,19 +103,123 @@
        #region ■ 一般方法___________________________
        /// <summary>
        /// 调整子FrameLayout的高度(只扩大,不缩小)
        /// </summary>
        /// <param name="frame"></param>
        /// <param name="buttomSpace">底部空白间距(真实值)</param>
        public void AdjustChidrenFrameHeight(FrameLayout frame, int buttomSpace)
        {
            //获取坐标底部最下面的那个控件的底部坐标
            int value = this.GetLocationMostLastViewBottom(frame);
            if (value != -1)
            {
                //调整桌布高度
                if (frame.Height < value + buttomSpace)
                {
                    frame.Height = value + buttomSpace;
                }
            }
        }
        /// <summary>
        /// 调整子FrameLayout的真实高度
        /// </summary>
        /// <param name="frame"></param>
        public void AdjustChidrenFrameRealHeight(FrameLayout frame)
        {
            //获取坐标底部最下面的那个控件的底部坐标
            int value = this.GetLocationMostLastViewBottom(frame);
            if (value != -1)
            {
                //调整桌布高度
                frame.Height = value;
            }
        }
        /// <summary>
        /// 调整桌布高度
        /// </summary>
        public void AdjustTableHeight()
        {
            var child = this.frameTable?.GetChildren(this.frameTable.ChildrenCount - 1);
            if (child != null)
            //2020.05.25追加
            if (this.frameBackTemp != null && this.frameBackTemp.Parent != null)
            {
                this.frameBackTemp.RemoveFromParent();
            }
            //获取坐标底部最下面的那个控件的底部坐标
            int value = this.GetLocationMostLastViewBottom(this.m_frameTable);
            if (value != -1)
            {
                //调整桌布高度
                if (this.frameTable.Height < child.Bottom)
                this.m_frameTable.Height = value;
            }
            else
            {
                //还原为原来的高度
                this.RecoverTableHeight();
            }
        }
        /// <summary>
        /// 针对底部点击按钮,调整控件真实高度
        /// </summary>
        /// <param name="correctionsValue">
        /// <para>Y轴补正值(真实值,列表控件不在bodyFramelayout的时候使用)</para>
        /// <para>一般为正数,如果为负数代表bodyFramelayout超出了顶部</para>
        /// </param>
        public void AdjustRealHeightByBottomButton(int correctionsValue = 0)
        {
            //调整桌布高度 2020.05.25追加
            this.AdjustTableHeight();
            var btnTemp = new BottomClickButton();
            if (btnTemp.Yaxis >= this.m_frameTable.Height + correctionsValue)
            {
                //没有超过
                return;
            }
            //添加临时控件,直至可以滑动超过底部按钮
            int oldRowSpace = this.rowSpace;
            this.rowSpace = 0;
            this.frameBackTemp = new FrameLayout();
            frameBackTemp.Height = ControlCommonResourse.BodyFrameHeight - btnTemp.Yaxis + Application.GetRealHeight(23);
            this.AddChidren(frameBackTemp);
            this.rowSpace = oldRowSpace;
        }
        /// <summary>
        /// 还原桌布高度
        /// </summary>
        public void RecoverTableHeight()
        {
            if (this.m_frameTable != null)
            {
                m_frameTable.Height = this.Height;
            }
        }
        /// <summary>
        /// 获取坐标底部最下面的那个控件的底部坐标
        /// </summary>
        /// <returns></returns>
        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)
                {
                    this.frameTable.Height = child.Bottom;
                    bottomHeight = child.Bottom;
                }
            }
            return bottomHeight;
        }
        #endregion