当改变UIScrollView的内容时,保持滚动行为和滚动条可见性

本文关键字:滚动 可见性 滚动条 UIScrollView 改变 | 更新日期: 2023-09-27 17:50:32

我需要为我的应用程序定制一个选项卡切换视图,所以我制作了一个带有UIScrollView和UITabBar的.xib。

我给UIScrollView添加了一个'ClearChildren'和一个'SwitchViews'方法,如下所示:

public static class Extensions
{
    #region UIScrollView extensions
    public static void ClearChildren (this UIScrollView scrollViewer)
    {
        foreach(var subview in scrollViewer.Subviews)
        {
            subview.RemoveFromSuperview();
        }
    }
    /// <summary>
    /// switches the content views of a UIScrollView entirely
    /// with for example a tab-bar.
    /// </summary>
    /// <param name="scrollViewer">
    /// A <see cref="UIScrollView"/>
    /// </param>
    /// <param name="newView">
    /// A <see cref="UIView"/>
    /// </param>
    public static void SwitchViews (this UIScrollView scrollViewer, UIView newView)
    {
        scrollViewer.ClearChildren();
        scrollViewer.AddSubview(newView);

        //reset content size
        scrollViewer.ContentSize = new System.Drawing.SizeF(newView.Bounds.Width, newView.Bounds.Height);
    }

    #endregion
}

然而,当我使用someUiScrollView.SwitchViews(someOtherScrollView)切换UIScrollView上的视图时UIScrollView突然失去了滚动条,允许水平和垂直滚动。

我如何确保水平和垂直滚动行为的UIScrollView不改变,并保持我的滚动条可见?

当改变UIScrollView的内容时,保持滚动行为和滚动条可见性

使用NSLog转储myScrollView的值。showshoriontalscrolllindicator和myScrollView。showsverticalscrolllindicator和myScrollView。scrollingEnabled查看它们的变化

我也会小心删除你的滚动视图的所有子视图。相反,当您添加子视图时,请跟踪它们(可能使用标记,或者在单独的数组中),并且只删除那些您自己显式添加的子视图。

最后,检查切换前后contentSize和bounds(或frame)的相对值,因为这也可能影响滚动行为。

加载的视图比UIScrollView稍微宽了一点。

如果这可以通过简单地设置新视图的宽度为UIScrollView的边界来防止,就像这样:

...
            scrollViewer.ClearChildren();
            newView.Bounds = new System.Drawing.RectangleF(new PointF(0f,0f), new SizeF(scrollViewer.Bounds.Width, newView.Bounds.Height));
            scrollViewer.AddSubview(newView);
...

(当然这意味着视图只能有垂直滚动,这是我在这个特殊的例子中想要的)