【问题标题】:maintain scrolling-behavior and scrollbar visibility when changing contents of UIScrollView更改 UIScrollView 的内容时保持滚动行为和滚动条可见性
【发布时间】:2011-04-18 22:28: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 的水平和垂直滚动行为不会改变,并保持滚动条可见?

【问题讨论】:

    标签: c# iphone c#-4.0 mono xamarin.ios


    【解决方案1】:

    使用 NSLog 转储 myScrollView.showsHoriontalScrollIndicator 和 myScrollView.showsVerticalScrollIndicator 和 myScrollView.scrollingEnabled 的值以查看它们的变化。

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

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

    【讨论】:

    • 好建议,但我将问题本身扼杀在萌芽状态,这确实是我正在加载的视图的范围。它们比滚动查看器宽一点,然后自动启用水平滚动。感谢您的宝贵时间,+1
    【解决方案2】:

    我加载的视图比 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);
    ...
    

    (当然这意味着视图只能进行垂直滚动,这是我在这个特定示例中想要的)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-19
      • 1970-01-01
      • 2014-09-21
      • 1970-01-01
      • 1970-01-01
      • 2011-12-31
      • 2011-10-03
      相关资源
      最近更新 更多