2016-12-25 85 views
2

我正在关注this tutorial。在它的AppDelegate中它有一个customizeAppearance(),其中UISearchBar & UINavigationBar是类型/类属性。它们不应该是窗口或我们所在的当前viewController之类的属性吗?!我们如何才能发布一个类,然后让它改变我们的UI?在AppDelegate中自定义UISearchBar&UINavigationBar的外观?为什么要在课堂而不是实例级别自定义?

FWIW当我cmmd点击...显然它只是把它带到类的定义。

import UIKit 

@UIApplicationMain 
class AppDelegate: UIResponder, UIApplicationDelegate { 

    var backgroundSessionCompletionHandler: (() -> Void)? 
    var window: UIWindow? 
    let tintColor = UIColor(red: 242/255, green: 71/255, blue: 63/255, alpha: 1) 

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 
    // Override point for customization after application launch. 
    customizeAppearance() 
    return true 
    } 

    func application(application: UIApplication, handleEventsForBackgroundURLSession identifier: String, completionHandler:() -> Void) { 
    backgroundSessionCompletionHandler = completionHandler 
    } 

    // MARK - App Theme Customization 

    private func customizeAppearance() { 
    window?.tintColor = tintColor 
    UISearchBar.appearance().barTintColor = tintColor // shouldn't UISearchBar be a property of some other object? 
    UINavigationBar.appearance().barTintColor = tintColor // shouldn't UINavigationBar be a property of some other object? 
    UINavigationBar.appearance().tintColor = UIColor.whiteColor() 
    UINavigationBar.appearance().titleTextAttributes = [NSForegroundColorAttributeName:UIColor.whiteColor()] 
    } 
} 
+2

引用[用于'UISearchBar'语言参考](https://developer.apple.com/reference/uikit/uisearchbar):_“您可以一次自定义搜索栏的外观,或者您可以使用外观代理('[UISearchBar appearance]')自定义应用程序中所有搜索栏的外观。 “_。在你接下来的教程中,他们选择了后者的代理方法,利用[UIAppearance'协议]中的蓝图的静态'appearance()'方法(https://developer.apple.com/reference/ uikit/uiappearance)例如'UISearchBar'符合(通过'UIView'继承)。 – dfri

+0

@dfri ohh。哇。这很方便。所以,如果我一次更换一个,并使用外观进行自定义。代理方法将被覆盖权利?也是这种*代理*机制在其他地方提供的可可触摸或不是? – Honey

+1

我不能说没有测试,但进一步引用语言参考。对于'UIAppearance':_“iOS在视图进入窗口时应用外观变化,它不会改变已经在窗口中的视图的外观......”_以及_“在任何给定的视图层次结构中,最外层的外观代理获胜。“_。所以我相信取决于您选择自定义外观的位置(或深度),默认/自定义代理行为(在视图进入窗口时加载)或您的自定义实例集行为将优先。看看参考文献。 docs for'UIAppearance' for det.s. – dfri

回答

1

(我将添加我的意见,回答OP的关于一流水平的定制,作为一个答案,因为评论是不是永久性的。可能的OP他/她可以根据试图添加备用彻底回答问题出在评论中讨论的查询)


报价the language reference for UISearchBar

丘斯托mizing外观

您可以一次自定义搜索栏一个外观,或者您 可以使用外观代理[UISearchBar appearance])来定制 在应用程序的所有搜索栏的外观。

外观代理被覆盖,例如,在UIKit User Interface Catalog - About Views

外观代理

您可以使用外观代理设置特定的外观视图的所有实例 特性在应用程序中。对于 示例,如果您希望应用中的所有滑块具有特定的 最小轨道色调颜色,则可以通过一条消息 指定该滑块的外观代理。

有两种方法可以自定义对象的外观:对于所有 实例以及包含在容器类实例中的实例。

...

还有在为UIAppearance protocol

使用UIAppearance协议,以获得外观代理的 类的语言参考。您可以通过 自定义类的实例的外观,向该类的外观 代理发送外观修改消息。

...

  • 要自定义一个类,使用appearance()的所有实例的外观获得外观代理该类

在你按照教程,他们已经选择使用外观代理的办法,利用静态appearance()方法作为UIAppearance协议blueprinted(到例如UISearchBar符合,通过UIView继承)从类级别获取并修改所有UISearchBar(和UINavigationBar)实例的外观代理。


以下博客文章涵盖了外观代理的主题。一种有益的读取,即使是稍微过时和使用的OBJ-C而不是夫特: