如何以编程方式布局在不同“模式”之间切换的应用程序?
Posted
技术标签:
【中文标题】如何以编程方式布局在不同“模式”之间切换的应用程序?【英文标题】:How do I layout an app that shifts between different "modes" programmatically? 【发布时间】:2013-01-03 20:22:09 【问题描述】:我想用一些共享代码为不同的“模式”制作一个具有不同视图的应用程序(有些元素我希望始终相同,并且背景会在不同的视图之间发生变化)。我将根据时间管理这些视图之间的转换。布局视图的最佳方式是什么?
我查看了一个标签视图,但它似乎有点不自然,因为标签栏不容易隐藏。我也可以做一个自定义容器(我最初的想法),但如果可能的话,留在“标准”ios视图中似乎会很好。
做一个自定义视图看起来不错/我错过了更好的方法吗?
【问题讨论】:
【参考方案1】:如果您的模式是基于堆栈的,您也可以考虑使用 UINavigationController。导航栏可以轻松隐藏(将hidesNavigationBar
设置为YES)。当您推送或弹出与模式相对应的控制器时,您可能需要将 animated
设置为 NO,除非滑入/滑出动画适合您。
【讨论】:
【参考方案2】:我会有两个版本的-layoutSubviews
的父视图。比如:
-(void)layoutSubviews
if ( self.mode == 0 )
[ self layoutMode0 ] ;
else if ( self.mode == 1 )
[ self layoutMode1 ] ;
您的布局代码还可以显示/隐藏某些视图或设置背景图像等。在您的代码中切换模式,调用 -setNeedsLayout
... 类似这样的:
-(void)setMode:(enum Modes)newMode
_mode = newMode ;
[ self setNeedsLayout ] ;
如果你想让模式切换动画,你可以做更多这样的事情:
-(void)setMode:(enum Mode)newMode animated:(BOOL)animated
_mode = newMode ;
if ( animated )
[ UIView animateWithDuration:0.25 animations:^
[ self layoutSubviews ] ;
]
else
[ self setNeedsLayout ] ;
你的普通二传手 -setMode:
看起来像这样:
-(void)setMode:(enum Mode)newMode
[ self setMode:newMode animated:NO ] ;
【讨论】:
检查我是否理解这一点:我最初希望将每个单独的视图保留在它们自己的视图控制器中。如果我这样做,我真的做不到,对吧? 我假设您的模式是在一个视图控制器下重新配置/改变同一组视图的布局。如果使用单独的视图控制器更有意义,您可以创建自己的父视图控制器类来管理一组子视图控制器。您的父视图控制器负责将子视图控制器的视图加载/卸载到它的内容视图中。您可以使用-[ UIViewController transitionFromViewController:toViewController:duration:options:animations:completion: ]
很好地过渡
创建自己的基本视图控制器并没有太多的工作,而且它并没有真正隐藏的魔力。
所以,真的没有一个正确的答案——你必须根据你的应用结构来决定..以上是关于如何以编程方式布局在不同“模式”之间切换的应用程序?的主要内容,如果未能解决你的问题,请参考以下文章
你能以编程方式在iOS 8(w / Swift)中切换“请勿打扰”模式吗?
Android:根据用户设置以编程方式更改 SourceSet