为啥 -[[UIButton appearance] setBackgroundImage] 会影响 UIBarItem 对象的初始外观以及如何纠正它?

Posted

技术标签:

【中文标题】为啥 -[[UIButton appearance] setBackgroundImage] 会影响 UIBarItem 对象的初始外观以及如何纠正它?【英文标题】:Why does -[[UIButton appearance] setBackgroundImage] affect the initial appearance of UIBarItem objects and how do you correct it?为什么 -[[UIButton appearance] setBackgroundImage] 会影响 UIBarItem 对象的初始外观以及如何纠正它? 【发布时间】:2012-02-02 19:12:25 【问题描述】:

当使用类代理自定义 UIButton 的外观时,UIBarItems 似乎最初采用了为 UIButton 设置的自定义属性。

从使用 Core Data 的默认 Master/Detail 项目开始。在 AppDelegate 中自定义 UIButton 的外观并运行应用程序。单击“编辑”按钮,然后单击 MasterViewController 导航栏中的“完成”按钮,然后观看自定义消失。

[AppDelegate application:didFinishLaunchingWithOptions]中的自定义外观代码:

UIImage *customBackground = [[UIImage imageNamed:@"yourcustomimage.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(5,5,5,5)];  
[[UIButton appearance] setBackgroundImage:customBackground forState:UIControlStateNormal];  

所有 UIBarButtonItem 都使用自定义背景进行初始化

当 Edit 按钮被 Done 按钮替换时,它正确地没有自定义背景。

A similar question asks how to customize the Done button。我担心为什么 UIBarItem 对象会发生这种情况,这些对象不是从 UIButton 继承的,并且想知道如何纠正它。

我怀疑代理继承和支持的属性,但我不知道如何纠正它。有什么建议吗?

【问题讨论】:

我遇到了同样的问题,但还没有找到很好的解决方案。我目前正在使用 '[UIButton appearanceWhenContainedIn:' 来修复这个错误。我对此并不满意,所以我很想听听其他人是否有更好的解决方案。 【参考方案1】:

我的建议是将backgroundImage 包含在UINavigationBar 中时重置为nil

[[UIButton appearance] setBackgroundImage:customBackground forState:UIControlStateNormal];
[[UIButton appearanceWhenContainedIn:[UINavigationBar class], nil] setBackgroundImage:nil forState:UIControlStateNormal];

【讨论】:

以上是关于为啥 -[[UIButton appearance] setBackgroundImage] 会影响 UIBarItem 对象的初始外观以及如何纠正它?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 DataGridView 上的 DoubleBuffered 属性默认为 false,为啥它受到保护?

为啥需要softmax函数?为啥不简单归一化?

为啥 g++ 需要 libstdc++.a?为啥不是默认值?

为啥或为啥不在 C++ 中使用 memset? [关闭]

为啥临时变量需要更改数组元素以及为啥需要在最后取消设置?

为啥 CAP 定理中的 RDBMS 分区不能容忍,为啥它可用?