2012-12-28 55 views
1

我使用外观API来定制我的UIBarButtonItems的外观。UIBarButtonItem与拉伸不平铺UIImage在iOS5

目前,我需要让我的按钮看起来像这样:

enter image description here

在iOS5中,你有这样的方法,这是我在用的:

UIImage *button = [[UIImage imageNamed:@"btn"] 
        resizableImageWithCapInsets:UIEdgeInsetsMake(3, 3, 3, 3)]; 
[[UIBarButtonItem appearance] setBackgroundImage:button forState:UIControlStateNormal 
             barMetrics:UIBarMetricsDefault]; 

但这种砖封顶非部分图像而不是拉伸,这给我这个:

enter image description here

iOS 6中有一个新的方法

resizableImageWithCapInsets:resizingMode: 

它可以让你指定一个“拉伸”调整模式,但它不适用于iOS5的。

如何让按钮伸展而不是平铺iOS5图像的中心?

+0

已添加是因为它是一个必要功能的原因。你可以在ios5中完全拉伸图像,或者你可以重复一遍一遍来填充空间,但是据我所知,拉伸特定部分是一个新的增加。 –

+0

我在想,它只是在某种程度上操纵引擎盖下的UIImage,所以我认为会有某种手动解决方法来达到与便捷方法相同的效果。 – Imran

+0

我不会说没有,因为我不知道肯定,但我不排除ios6添加更多便捷方法来完成任务的可能性。在幕后添加额外的绘制功能可以让事情发生。 –

回答

0

原来,这在iOS5中是不可能的,如果按钮样式是梯形的,那么按钮应该总是使用水平样式渐变。我最终改变了渐变方向。

+0

是的,使用SDK兼容性指南中描述的旧iOS5方法和技术,它**是可能的。看到我的答案。 – AliSoftware

0

您可以使用旧的和过时stretchableImageWithLeftCapWidth:topCapHeight:方法iOS5的,如果你需要拉伸:

UIImage* (^makeStretchableImage)(UIImage*, CGSize) = nil; 
if ([UIImage instancesRespondToSelector:@selector(resizableImageWithCapInsets:resizingMode:)]) 
{ 
    // If resizableImageWithCapInsets:resizingMode: is available, use it 
    makeStretchableImage = ^(UIImage* image, CGSize inset) { 
     return [image resizableImageWithCapInsets:UIEdgeInsetsMake(inset.height, inset.width, inset.height, inset.width) resizingMode:UIImageResizingModeStretch]; 
    }; 
} 
else 
{ 
    // Else, we are on an older iOS release, use the deprecated iOS5 method instead 
    makeStretchableImage = ^(UIImage* image, CGSize inset) { 
     return [image stretchableImageWithLeftCapWidth:inset.width topCapHeight:inset.height]; 
    }; 
} 

UIImage* stretchableImage1 = makeStretchableImage(originalImage1, CGSizeMake(5,2)); 
UIImage* stretchableImage2 = makeStretchableImage(originalImage2, CGSizeMake(15,4)); 
UIImage* stretchableImage3 = makeStretchableImage(originalImage3, CGSizeMake(8,5));