有没有办法在 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 启用滚动条?

在 AppDelegate 中为其他 Viewcontroller 初始化 managedContect

有没有办法在 Django 中为内联管理表单设置单独的页面?