美文网首页iOSiOS相关技术IOS
UITabBarItem与UIImageRenderingMod

UITabBarItem与UIImageRenderingMod

作者: 嘻嘻zhy | 来源:发表于2015-10-19 15:24 被阅读4653次

    前言

    今天遇到了UITabBarItem中图片错误的信息。
    这是解决问题之后整理下来的心得。

    创建UITabBarIte

    在创建UITabBarItem的时候一般会为创建的UITabBarItem赋值三个东西。 标题(title),图片(image),选中时显示的图片(selectedImage)。

    tabBarItem.title = @"Two";  
    tabBarItem.image = [UIImage imageNamed:@"one.png"];  
    tabBarItem.selectedImage = [UIImage imageNamed:@"two.png"];
    

    现在的IOS7中新增了方法,

     - (instancetype)initWithTitle:(nullableNSString *)title image:(nullableUIImage *)image selectedImage:(nullableUIImage *)selectedImage
     NS_AVAILABLE_IOS(7_0);
    

    使新建tabBarItem更加方便。现在可以将上面三行代码改为:

     tabBarItem= [[UITabBarItem alloc]initWithTitle:@"Two"        
            image:[UIImage imageNamed:@"one.png"]
    selectedImage:[UIImageimageNamed:@"two.png"]];
    

    在该方法替代了从IOS5产生到IOS7开始抛弃的三个方法:

     - (void)setFinishedSelectedImage:(nullable UIImage *)selectedImage withFinishedUnselectedImage:(nullable UIImage *)unselectedImage
     NS_DEPRECATED_IOS(5_0,7_0,"Use initWithTitle:image:selectedImage: or the image and selectedImage properties along with UIImageRenderingModeAlwaysOriginal");
     (nullable UIImage *)finishedSelectedImage 
     NS_DEPRECATED_IOS(5_0,7_0);
     (nullable UIImage *)finishedUnselectedImage 
     NS_DEPRECATED_IOS(5_0,7_0);
    

    同时在相同的API中,有这么一个注释:

    /* The unselected image is autogenerated from the image argument. The selected image is autogenerated from the selectedImage if provided and the image argument otherwise.
    To prevent system coloring, provide images with UIImageRenderingModeAlwaysOriginal (see UIImage.h) */

    最后一句粗体文本意思是为了防止系统渲染,必须以UIImageRenderingModeAlwaysOriginal提供图片。若不以这种形式,那么提供的图片显示时会发生渲染错误的问题。
    那么UIImageRenderingModeAlwaysOriginal到底是什么呢?


    UIImageRenderingMode

    在IOS7中增加创建UITabBarItem的方法的同时新增了 UIImageRenderingMode属性。

    typedef NS_ENUM(NSInteger, UIImageRenderingMode) {
        UIImageRenderingModeAutomatic,          // Use the default rendering mode for the context where the image is used
        UIImageRenderingModeAlwaysOriginal,     // Always draw the original image, without treating it as a template
        UIImageRenderingModeAlwaysTemplate,     // Always draw the image as a template image, ignoring its color information } NS_ENUM_AVAILABLE_IOS(7_0);
    

    在该模式的枚举值中,一共存在三个值,
    UIImageRenderingModeAutomatic、 UIImageRenderingModeAlwaysOriginal与UIImageRenderingModeAlwaysTemplate。

    1.UIImageRenderingModeAutomatic // 根据图片的使用环境和所处的绘图上下文自动调整渲染模式。
    2.UIImageRenderingModeAlwaysOriginal // 始终绘制图片原始状态,不使用Tint Color。
    3.UIImageRenderingModeAlwaysTemplate // 始终根据Tint Color绘制图片,忽略图片的颜色信息。

    UIImageRenderingMode属性的默认值是UIImageRenderingModeAutomatic,即UIImage是否使用Tint Color取决于它显示的位置。其他情况可以看下面的图例


    图例图例

    最后

    修改上面的代码,将两者结合到一起
    UIImageRenderingMode使用:

      UIImage *img = [UIImage imageNamed:@"test.png"];
      img=[img imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    

    综合:

     tabBarItem= [[UITabBarItemalloc]initWithTitle:@"Five"
                         image:[[UIImageimageNamed:@"five.png"]imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal ]  
                                     selectedImage:[[UIImageimageNamed:@"five.png"]imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal ]];
    

    相关文章

      网友评论

      • f9e9e39f63c7:tabBarItem= [[UITabBarItem alloc]initWithTitle:@"Two"
        image:[UIImage imageNamed:@"one.png"]
        selectedImage:[UIImageimageNamed:@"two.png"]];
        在使用中没有发现这个方法?
        f9e9e39f63c7:@Vevo 不好意思 刚才找了下找到了

      本文标题:UITabBarItem与UIImageRenderingMod

      本文链接:https://www.haomeiwen.com/subject/vbvzcttx.html