C# 更改UIScrollView内容时保持滚动行为和滚动条可见性
我的应用程序需要一个自定义选项卡切换视图,所以我用UIScrollView和UITabBar创建了一个.xib 我向UIScrollView添加了“ClearChildren”和“SwitchView”方法,如下所示:C# 更改UIScrollView内容时保持滚动行为和滚动条可见性,c#,iphone,c#-4.0,mono,xamarin.ios,C#,Iphone,C# 4.0,Mono,Xamarin.ios,我的应用程序需要一个自定义选项卡切换视图,所以我用UIScrollView和UITabBar创建了一个.xib 我向UIScrollView添加了“ClearChildren”和“SwitchView”方法,如下所示: public static class Extensions { #region UIScrollView extensions public static void ClearChildren (this UIScrollView scrollViewer)
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
}
公共静态类扩展
{
#区域UIScrollView扩展
公共静态void ClearChildren(此UIScrollView滚动查看器)
{
foreach(scrollViewer.Subviews中的var子视图)
{
subview.RemoveFromSuperview();
}
}
///
///完全切换UIScrollView的内容视图
///例如,使用选项卡栏。
///
///
///A
///
///
///A
///
公共静态void开关视图(此UIScrollView scrollViewer、UIView newView)
{
scrollViewer.ClearChildren();
scrollViewer.AddSubview(newView);
//重置内容大小
scrollViewer.ContentSize=new System.Drawing.SizeF(newView.Bounds.Width,newView.Bounds.Height);
}
#端区
}
但是,当我使用someUiScrollView.switchView(someOtherScrollView)
UIScrollView会突然丢失其滚动条,并允许水平和垂直滚动
如何确保UIScrollView的水平和垂直滚动行为不发生更改,并保持滚动条可见?使用NSLog转储myScrollView.showsHoriontalScrollIndicator和myScrollView.showsVerticalScrollIndicator和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);
...
(当然,这意味着视图只能进行垂直滚动,这就是我在这个特定示例中想要的)好建议,但我将问题本身扼杀在萌芽状态,它确实是我加载的视图的边界。它们比scrollviewer稍宽一点,scrollviewer会自动启用horizontall滚动。谢谢你的时间,还有+1