Ios 使用UIImageRenderingModeAlways或原始图像在UIAbbarItem上显示徽章时出现问题

Ios 使用UIImageRenderingModeAlways或原始图像在UIAbbarItem上显示徽章时出现问题,ios,uikit,uitabbarcontroller,uitabbaritem,Ios,Uikit,Uitabbarcontroller,Uitabbaritem,我试图在一些配置了UIImageRenderingModeAlwaysOriginal图像的UIAbbarItems上显示徽章。我这样做是因为想要的效果就像是一个提升的UITabBarItem a-la Instagram。这是我用来测试它的代码,它属于UITabBarController类别: - (void) replaceImageForTab:(int)itemIndex defaultImage:(UIImage *)defaultImage

我试图在一些配置了UIImageRenderingModeAlwaysOriginal图像的UIAbbarItems上显示徽章。我这样做是因为想要的效果就像是一个提升的UITabBarItem a-la Instagram。这是我用来测试它的代码,它属于UITabBarController类别:

- (void) replaceImageForTab:(int)itemIndex
               defaultImage:(UIImage *)defaultImage
              selectedImage:(UIImage *)selectedImage
                      title:(NSString *)title
{
    NSArray *viewControllers = [self viewControllers];
    UIViewController *vc = [viewControllers objectAtIndex:itemIndex];
    [vc.tabBarItem setImage:[defaultImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]];
    [vc.tabBarItem setSelectedImage:[selectedImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]];
    [vc.tabBarItem setTitle:title];

    [vc.tabBarItem setBadgeValue:@"1"];
}
- (void) v_setBadgeValue:(NSString *)badgeValue inTab:(NSInteger)tabIndex
{
    NSArray *viewControllers = [self viewControllers];
    UIViewController *vc = [viewControllers objectAtIndex:tabIndex];
    UITabBarItem *tabBarItem = vc.tabBarItem;

    UIImage *normalImage = tabBarItem.image;
    UIImage *selectedImage = tabBarItem.selectedImage;

    UIImage *badgedNormalImage = [[self class] addBadgeWithValue:badgeValue toImage:normalImage];
    UIImage *badgedSelectedImage = [[self class] addBadgeWithValue:badgeValue toImage:selectedImage];

    [tabBarItem setImage:[badgedNormalImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]];
    [tabBarItem setSelectedImage:[badgedSelectedImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]];

}

+ (UIImage *) addBadgeWithValue:(NSString *)badgeValue toImage:(UIImage *)image
{
    //Here you have to create your badge view. Let's just use a red square for now
    UIView *badgeView = [[UIView alloc] initWithFrame:CGRectMake(16, 3, 14, 14)];
    [badgeView setBackgroundColor:[UIColor redColor]];

    UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
    [imageView addSubview:badgeView];

    UIGraphicsBeginImageContextWithOptions((imageView.bounds.size), NO, [[UIScreen mainScreen] scale]);
    [imageView.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return viewImage;
}
但是,徽章图像会被剪裁显示,如下所示:


我认为这是因为徽章被添加到UITabBar的UIView中,并且它正在剪辑其内容。但我不能修改这个值,因为那是私有财产。我还有什么其他选择

我还没有找到一种方法来更改股票徽章中的偏移量,因此我不得不推出自己的解决方案。这并不漂亮,但它可以工作这是,再一次,在一个UITabBarController类别上:

- (void) replaceImageForTab:(int)itemIndex
               defaultImage:(UIImage *)defaultImage
              selectedImage:(UIImage *)selectedImage
                      title:(NSString *)title
{
    NSArray *viewControllers = [self viewControllers];
    UIViewController *vc = [viewControllers objectAtIndex:itemIndex];
    [vc.tabBarItem setImage:[defaultImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]];
    [vc.tabBarItem setSelectedImage:[selectedImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]];
    [vc.tabBarItem setTitle:title];

    [vc.tabBarItem setBadgeValue:@"1"];
}
- (void) v_setBadgeValue:(NSString *)badgeValue inTab:(NSInteger)tabIndex
{
    NSArray *viewControllers = [self viewControllers];
    UIViewController *vc = [viewControllers objectAtIndex:tabIndex];
    UITabBarItem *tabBarItem = vc.tabBarItem;

    UIImage *normalImage = tabBarItem.image;
    UIImage *selectedImage = tabBarItem.selectedImage;

    UIImage *badgedNormalImage = [[self class] addBadgeWithValue:badgeValue toImage:normalImage];
    UIImage *badgedSelectedImage = [[self class] addBadgeWithValue:badgeValue toImage:selectedImage];

    [tabBarItem setImage:[badgedNormalImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]];
    [tabBarItem setSelectedImage:[badgedSelectedImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]];

}

+ (UIImage *) addBadgeWithValue:(NSString *)badgeValue toImage:(UIImage *)image
{
    //Here you have to create your badge view. Let's just use a red square for now
    UIView *badgeView = [[UIView alloc] initWithFrame:CGRectMake(16, 3, 14, 14)];
    [badgeView setBackgroundColor:[UIColor redColor]];

    UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
    [imageView addSubview:badgeView];

    UIGraphicsBeginImageContextWithOptions((imageView.bounds.size), NO, [[UIScreen mainScreen] scale]);
    [imageView.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return viewImage;
}
现在你完全控制了徽章的偏移量和位置,如果你和我一样,有一个非常奇怪的UITabBar可以一起工作,这一点很重要。结果是: