UIAppearance不是那么简单

UIAppearance协议于2011年在iOS 5中出现,那是在遥远的时代,当时Instagram还没有Android应用程序,而串行Ned Stark尚未被切断。


关于爱达德

大师们向我发送了乌鸦的消息称,在发布iOS 5时,他们已经被砍掉了。 但是为了不破坏红色婚礼或其他事情,也许我会保留一切。


有足够的信息,教程,关于此主题的文章,每个iOS初学者都知道如何使用它以及为什么使用它,因此本文并非如此。 我想反省一下他怎么了,为什么苹果公司不关注它。


作为一个简短的介绍, 文档的摘录一直是,现在并且应该是主要的可信赖信息来源。


您可以通过将外观修改消息发送到类的外观代理来自定义类实例的外观。

为了支持外观定制,一个类必须符合UIAppearanceContainer协议,并且相关的访问器方法必须标记有UI_APPEARANCE_SELECTOR

对我自己来说,我是这样理解的:如果要更改实现UIAppearance的类的所有对象的默认外观,请检查该属性是否用UI_APPEARANCE_SELECTOR标记,然后继续。 因此,如果该属性不是UI_APPEARANCE_SELECTOR ,那么它将不起作用。


但是“不成功”并不意味着“您无法尝试”,所以我建议每个人都对做一个简单的实验感到好奇:打开您获得的第一个项目,并将以下行添加到application:didFinishLaunchingWithOptions:方法:


 UIView.appearance().isHidden = true 

估计会发生什么并运行。


我很无聊,希望有可能的选择:


  • 什么都没发生
  • 什么都没有发生,但是类似“ isHidden不是UI_APPEARANCE_SELECTOR,愚蠢”的日志落入控制台;
  • 应用程序捕获严重错误或使用类似消息进行断言。

但是不,所有东西,包括主应用程序窗口,都被隐藏了。 一方面,这甚至是合乎逻辑的-完成的工作已完成。 但另一方面,它看起来像是没有记录的行为,在我看来,这是一个相当大的漏洞。


我仍然可以接受这样的事实:如果仅可以使用影响外观的那些属性来旋转这些技巧,但是可以使用所有属性来完成!


例如,将以下行添加到其他项目用作第三方库的代码中,有时会在随机时间调用该行:


 UITableView.appearance().delegate = nil 

您可以在执行此代码后将所有委托重置为屏幕上显示的所有表。


尝试弄清楚发生了什么事,开发人员会很有趣! 当然,您可以想出一些更有趣的东西!


我确实希望Apple不会引起人们的注意(我没有找到有关此主题的任何信息),并且在AppstoreConnect中自动组装验证阶段的某个地方揭示了这些技巧。 但老实说,我不想检查。


伙计们。 我将很高兴讨论是否有人对此主题也感兴趣。


PS将我的2011年还给我!

Source: https://habr.com/ru/post/zh-CN453126/


All Articles