我試着這樣做:我可以將紋理應用於UIToolbar嗎?
[toolbar setTint:[UIColor colorWithPatternImage:[UIImage imageNamed:@"thingFromMyBundle.png"]]];
,但它只是結束了黑色。起初,我認爲你不允許用紋理「着色」,但我最近看到過可以做到這一點的應用程序。我錯過了什麼嗎?
謝謝。
我試着這樣做:我可以將紋理應用於UIToolbar嗎?
[toolbar setTint:[UIColor colorWithPatternImage:[UIImage imageNamed:@"thingFromMyBundle.png"]]];
,但它只是結束了黑色。起初,我認爲你不允許用紋理「着色」,但我最近看到過可以做到這一點的應用程序。我錯過了什麼嗎?
謝謝。
2個文件添加到您的項目,叫他們例如UINavigationBar-CustomTexture.h
和UINavigationBar-CustomTexture.m
,在這些文件中把這個:
.h文件中:
#import <UIKit/UIKit.h>
@interface UINavigationBar (CustomTexture)
@end
.m文件:
#import "UINavigationBar-CustomTexture.h"
@interface UIView (CustomTexture)
- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx;
@end
@implementation UINavigationBar (CustomTexture)
- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx {
if ([self isMemberOfClass:[UINavigationBar class]]){
UIImage *image = [UIImage imageNamed:@"myImage.png"];
CGContextScaleCTM(ctx, 1.0f, -1.0f);
CGContextDrawImage(ctx, CGRectMake(0, -image.size.height, self.frame.size.width, self.frame.size.height), image.CGImage);
}else{
[super drawLayer:layer inContext:ctx];
}
}
@end
在實例化導航控制器的地方包含.h文件。 使你的PNG文件320x44。根據你的紋理,你的導航欄的色調顏色更改爲這樣的事(讓導航欄上的按鈕看起來更好):
[self.navigationController.navigationBar setTintColor:[UIColor colorWithHue:0 saturation:0 brightness:0.5f alpha:0.1f]];
下面是我解決這個問題如何得到:
_titleToolbar= [[UIToolbar alloc] initWithFrame:CGRectMake(0.0f, 0.0f, kDeviceWidth, 34.0f)];
[_titleToolbar setTranslucent:YES];
[_titleToolbar setBackgroundColor:[UIColor clearColor]];
CALayer* backgroundLayer = [CALayer layer];
[backgroundLayer setFrame:CGRectMake(0, 0, kDeviceWidth, _titleToolbar.frame.size.height)];
UIImage* patternImage = [UIImage deviceImageNamed:@"topToolbarBackground"];
[backgroundLayer setBackgroundColor:[UIColor colorWithPatternImage:patternImage].CGColor];
[[_titleToolbar layer] insertSublayer:backgroundLayer atIndex:0];
它適用於我,但我得到一個「:doClip:空路徑。」。 如果我刪除了CGContextClip(ctx);他們的警告消失了(並且一切仍然有效)。 –
morais
2010-07-14 16:39:58
一個類別真的不是處理自定義繪圖的好方法。您正在重寫UINavigationBar的標準實現(如果有的話),並且永遠不會調用該實現。子類化是處理它的正確方式,但是它需要更多的工作來設置xib文件中的導航欄的類,但是更具前景證明性。 – wbyoung 2011-01-06 17:10:15