有没有办法在 appdelegate 中为整个项目的所有 UIImage 属性使用`UIImageRenderingModeAlwaysOriginal`
Posted
技术标签:
【中文标题】有没有办法在 appdelegate 中为整个项目的所有 UIImage 属性使用`UIImageRenderingModeAlwaysOriginal`【英文标题】:Is there any way to use `UIImageRenderingModeAlwaysOriginal` in appdelegate for all UIImage Property across the project 【发布时间】:2015-05-27 06:11:52 【问题描述】:[[UITextField appearance] setTintColor:[UIColor myColor]];
[[UITextView appearance] setTintColor:[UIColor myColor]];
在 appDelegate 中设置UITextField
& UITextView
光标颜色后,突然我面临很多NavigationItemBar
图像变成默认蓝色。它的实际颜色不显示。解决方案是设置每个NavigationItemBar
图像都用这个UIImageRenderingModeAlwaysOriginal
喜欢:
`[[UIImage imageNamed:@"imageName.png"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];`
我只是想知道有没有办法在appDelegate
中设置这个UIImage
属性(UIImageRenderingModeAlwaysOriginal
)?这样我就不必更改项目中的每个地方,而是设置在一个地方。
非常感谢。
【问题讨论】:
我认为没有这样的方式存在:( 我使用了凌乱的解决方案,但它有效。参考this和我的回答。 【参考方案1】:导入 obj-c 运行时。
<objc/runtime.h>
声明以下 C 函数以混合方法。
void SwizzleClassMethod(Class c, SEL orig, SEL new)
Method origMethod = class_getClassMethod(c, orig);
Method newMethod = class_getClassMethod(c, new);
c = object_getClass((id)c);
if(class_addMethod(c, orig, method_getImplementation(newMethod), method_getTypeEncoding(newMethod)))
class_replaceMethod(c, new, method_getImplementation(origMethod), method_getTypeEncoding(origMethod));
else
method_exchangeImplementations(origMethod, newMethod);
声明一种新方法以混入UIImage
类别
+ (instancetype)renderingMode_imageNamed:(NSString *)imageName
UIImage *image = [UIImage renderingMode_imageNamed:imageName];
return [image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
覆盖UIImage
类别中的+load
+ (void)load
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^
SwizzleClassMethod([UIImage class], @selector(imageNamed:), @selector(renderingMode_imageNamed:))
)
导入您的类别。
现在每次使用+imageNamed
,它都会自动改变渲染模式。
【讨论】:
唷,打字花了好长时间。 非常感谢您的回答。实际上,我已经在每个地方手动开始更改。但你的答案对我来说看起来很完美。而且您还参考了链接。这太棒了。谢谢你的时间。 :)【参考方案2】:创建自定义UIBarButtonItem
并尝试。
@implementation ViewController
- (void)viewDidLoad
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[self.navigationItem setTitle:@"Sample title"];
UIImageView *customView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 40, 40)];
[customView setImage:[UIImage imageNamed:@"SettingIcon"]];
UIBarButtonItem *right = [[UIBarButtonItem alloc] initWithCustomView:customView];
[self.navigationItem setRightBarButtonItem:right];
@end
这对我有用。
【讨论】:
他想要一种全局设置方法,而不是单独设置。以上是关于有没有办法在 appdelegate 中为整个项目的所有 UIImage 属性使用`UIImageRenderingModeAlwaysOriginal`的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法在 Xcode 4 中为 ARM 而不是 Thumb 编译?
在 AppDelegate 中为两个视图控制器使用和更新 NSMutableString
有没有办法在代码中为 RecyclerView 启用滚动条?