如何以编程方式布局在不同“模式”之间切换的应用程序?

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

以编程方式在两个 UIViewController 之间切换

如何以编程方式切换到不同的 PanoramaItem?

如何以编程方式在 foreach 中的 %do% 和 %dopar% 之间切换?