兩件事情我想做的事情,這是相關的:如何爲圖像着色/顯示顏色?
- 顯示任何顏色的塊。所以我可以隨時將這種顏色改變成別的東西。
- 色調UIImage是不同的顏色。阿爾法被關閉的顏色疊加在這裏可以工作,但是說它是一個透明背景的圖像,並沒有佔據整個圖像的正方形。
任何想法?
兩件事情我想做的事情,這是相關的:如何爲圖像着色/顯示顏色?
任何想法?
第一個很容易。製作一個新的UIView
並將其背景顏色設置爲任何你喜歡的顏色。
第二個比較困難。正如你所提到的,你可以在透明度被拒絕的情況下放置一個新的視圖,但爲了讓它在相同的地方剪輯,你需要使用一個蒙版。這樣的事情:
UIImage *myImage = [UIImage imageNamed:@"foo.png"];
UIImageView *originalImageView = [[UIImageView alloc] initWithImage:myImage];
[originalImageView setFrame:CGRectMake(0.0f, 0.0f, 100.0f, 100.0f)];
[parentView addSubview:originalImageView];
UIView *overlay = [[UIView alloc] initWithFrame:[originalImageView frame]];
UIImageView *maskImageView = [[UIImageView alloc] initWithImage:myImage];
[maskImageView setFrame:[overlay bounds]];
[[overlay layer] setMask:[maskImageView layer]];
[overlay setBackgroundColor:[UIColor redColor]];
[parentView addSubview:overlay];
請記住,您將不得不在#import <QuartzCore/QuartzCore.h>
執行文件中。
實現1的一個簡單方法是創建UILabel甚至UIView並根據需要更改backgroundColor。
有一種方法可以乘以顏色,而不是僅僅覆蓋它們,這應該適用於2.請參閱this tutorial。
另一種選擇,是使用的分類方法上的UIImage這樣的...
// Tint the image, default to half transparency if given an opaque colour.
- (UIImage *)imageWithTint:(UIColor *)tintColor {
CGFloat white, alpha;
[tintColor getWhite:&white alpha:&alpha];
return [self imageWithTint:tintColor alpha:(alpha == 1.0 ? 0.5f : alpha)];
}
// Tint the image
- (UIImage *)imageWithTint:(UIColor *)tintColor alpha:(CGFloat)alpha {
// Begin drawing
CGRect aRect = CGRectMake(0.f, 0.f, self.size.width, self.size.height);
UIGraphicsBeginImageContext(aRect.size);
// Get the graphic context
CGContextRef c = UIGraphicsGetCurrentContext();
// Converting a UIImage to a CGImage flips the image,
// so apply a upside-down translation
CGContextTranslateCTM(c, 0, self.size.height);
CGContextScaleCTM(c, 1.0, -1.0);
// Draw the image
[self drawInRect:aRect];
// Set the fill color space
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextSetFillColorSpace(c, colorSpace);
// Set the mask to only tint non-transparent pixels
CGContextClipToMask(c, aRect, self.CGImage);
// Set the fill color
CGContextSetFillColorWithColor(c, [tintColor colorWithAlphaComponent:alpha].CGColor);
UIRectFillUsingBlendMode(aRect, kCGBlendModeColor);
UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
// Release memory
CGColorSpaceRelease(colorSpace);
return img;
}
試試這個
- (void)viewDidLoad
{
[super viewDidLoad];
UIView* maskedView = [self filledViewForPNG:[UIImage imageNamed:@"mask_effect.png"]
mask:[UIImage imageNamed:@"mask_image.png"]
maskColor:[UIColor colorWithRed:.6 green:.2 blue:.7 alpha:1]];
[self.view addSubview:maskedView];
}
-(UIView*)filledViewForPNG:(UIImage*)image mask:(UIImage*)maskImage maskColor:(UIColor*)maskColor
{
UIImageView *pngImageView = [[UIImageView alloc] initWithImage:image];
UIImageView *maskImageView = [[UIImageView alloc] initWithImage:maskImage];
CGRect bounds;
if (image) {
bounds = pngImageView.bounds;
}
else
{
bounds = maskImageView.bounds;
}
UIView* parentView = [[UIView alloc]initWithFrame:bounds];
[parentView setAutoresizesSubviews:YES];
[parentView setClipsToBounds:YES];
UIView *overlay = [[UIView alloc] initWithFrame:bounds];
[[overlay layer] setMask:[maskImageView layer]];
[overlay setBackgroundColor:maskColor];
[parentView addSubview:overlay];
[parentView addSubview:pngImageView];
return parentView;
}
請解釋您的答案。 – hims056
這裏是實現圖像着色的另一種方式,特別是如果你已經使用QuartzCore做其他事情。
進口QuartzCore:
#import <QuartzCore/QuartzCore.h>
創建透明的CALayer,並添加爲圖像的子層要色調:
CALayer *sublayer = [CALayer layer];
[sublayer setBackgroundColor:[UIColor whiteColor].CGColor];
[sublayer setOpacity:0.3];
[sublayer setFrame:toBeTintedImage.frame];
[toBeTintedImage.layer addSublayer:sublayer];
添加QuartzCore到項目框架列表(如果它不是」 t已經在那裏),否則你會得到像這樣的編譯器錯誤:
Undefined symbols for architecture i386: "_OBJC_CLASS_$_CALayer"
我有一些困難得到hori zontal居中工作。起初,我將覆蓋圖添加爲UITableViewCell的子視圖,並且在調整單元格大小時丟失了居中。我通過添加覆蓋作爲單元格內的UILabel字段的子視圖來解決此問題,而不是UITableViewCell本身。 – bneely
您也可以嘗試將其添加到表格視圖單元格的「contentView」中。 –