使用 UIAppearance 渲染图像

Posted

技术标签:

【中文标题】使用 UIAppearance 渲染图像【英文标题】:Rendering Image with UIAppearance 【发布时间】:2013-07-31 05:12:46 【问题描述】:

我在渲染具有自定义 uiappearance 集的滑块的视图控制器图像时遇到问题。图像渲染良好,但是图像中的滑块只有默认外观。如果我转到该视图控制器 (vc2),则 uiappearance 将设置为自定义外观。任何想法如何使用自定义滑块外观呈现图像?

我在第一个视图控制器上有一个 UIImageView。在第二个视图控制器上,我有一个滑块。

ViewController.m

ViewController *vc2 = [[ViewController alloc]init];
vc2 = [self.storyboard instantiateViewControllerWithIdentifier:@"vc2"];
UIGraphicsBeginImageContextWithOptions(self.view.bounds.size,NO,0.0);
[vc2.view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
[_image setImage:viewImage];

AppDelegate.m

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary      *)launchOptions
    
    [self customizeAppearance];
    // Override point for customization after application launch.
    return YES;
    
    - (void) customizeAppearance; 
    UIImage *minImage = [[UIImage imageNamed:@"slider_minimum.png"]
                         resizableImageWithCapInsets:UIEdgeInsetsMake(0, 13, 0, 0)];
    UIImage *maxImage = [[UIImage imageNamed:@"slider_maximum.png"]
                         resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 13)];
    UIImage *thumbImage = [UIImage imageNamed:@"slider_thumb.png"];

    [[UISlider appearance] setMaximumTrackImage:maxImage
                                       forState:UIControlStateNormal];
    [[UISlider appearance] setMinimumTrackImage:minImage
                                       forState:UIControlStateNormal];
    [[UISlider appearance] setThumbImage:thumbImage
                                forState:UIControlStateNormal];
    [[UISlider appearance] setThumbImage:thumbImage
                                forState:UIControlStateHighlighted];

    

【问题讨论】:

这可能与您在获取视图控制器的图像之前没有显示视图控制器的视图有关。尝试推动它并拍摄图像,然后立即关闭。 @PartiallyFinite: 即使我把它改成 [self.view.layer renderInContext:UIGraphicsGetCurrentContext()];和第一个视图控制器的滑块,它仍然使用默认滑块。很奇怪吧? 根据this answer,UIAppearance 自定义仅在视图上调用layoutSubviews 之前应用,因此在您获取快照时它们可能尚未应用。 【参考方案1】:

感谢@PartiallyFinite 的指导,我发现我需要在 ViewController 内部执行以下操作:

UIImage *minImage = [UIImage imageNamed:@"slider_minimum.png"];
UIImage *maxImage = [UIImage imageNamed:@"slider_maximum.png"];
UIImage *tumbImage= [UIImage imageNamed:@"slider_thumb.png"];

minImage = [minImage resizableImageWithCapInsets:UIEdgeInsetsMake(0, 3, 0, 0)];
maxImage = [maxImage resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 13)];

[_slider setMinimumTrackImage:minImage forState:UIControlStateNormal];
[_slider setMaximumTrackImage:maxImage forState:UIControlStateNormal];
[_slider setThumbImage:tumbImage forState:UIControlStateNormal];

【讨论】:

以上是关于使用 UIAppearance 渲染图像的主要内容,如果未能解决你的问题,请参考以下文章

使用 UIAppearance 在更改后更新导航栏

UIPrintInteractionController 和 UIAppearance 的 navigationBar

覆盖MFMailComposeViewController的UIAppearance属性

iOS – UIAppearance appearanceWhenContainedIn 问题

UINavigationBar + UIToolBar UIAppearance以及应用程序某些部分的半透明barStyle?

UIAppearance 的“当不包含在”中