我遇到以下代码的问题。
我想在一个以上的按钮上使用一个UIImageView,对我来说,仅定义一次UIImageView并根据需要多次使用它似乎是合乎逻辑的。
如果我尝试将imgView1连接到两个不同的按钮,则只显示其中一个。
我可以使用注释掉的imgView2来解决这个问题。
但我必须做到这一点似乎很愚蠢。为什么我不能只有一个UIImageView然后将它添加到我需要的多个视图中?
// This will not allow me to use imgView1 more than once and only one of the imgViews/buttons is displayed.
UIImage *image = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"some_image" ofType:@"png"]];
UIImageView *imgView1 = [[UIImageView alloc] initWithImage:image];
//UIImageView *imgView2 = [[UIImageView alloc] initWithImage:image];
CGRect frame = CGRectMake(10, 10, 70, 72);
UIButton *h=[UIButton buttonWithType:UIButtonTypeCustom];
[h setFrame:frame];
[h insertSubview:imgView1 atIndex:1];
frame = CGRectMake(100, 10, 70, 72);
UIButton *h2=[UIButton buttonWithType:UIButtonTypeCustom];
[h2 setFrame:frame];
[h2 insertSubview:imgView1 atIndex:1];
[self.view addSubview:h];
[self.view addSubview:h2];
[imgView1 release];
//[imgView2 release];
编辑:
上下文
我在我的问题中添加了一些上下文
我正在尝试使用位于实际图片后面的渐变背景图层来创建图像,这是对此图像的后续问题(网址:Making a Transparent image button with bgcolor)
虽然我可以简单地使用setImage,但它不会将渐变背景图层放入背景中。
例如:
int fullFrameX = 25;
int extFrameX = fullFrameX + 3;
CGRect fullFrame;
CGRect frame;
fullFrame = CGRectMake(fullFrameX, 10, 70,72);
frame = CGRectMake(extFrameX, 13, 63,65);
UIButton *h=[UIButton buttonWithType:UIButtonTypeCustom];
[h setFrame:fullFrame];
[[h layer] setMasksToBounds:YES];
//[h setBackgroundImage:image forState:UIControlStateNormal];
[h setImage:image forState:UIControlStateNormal];
[h setShowsTouchWhenHighlighted:YES];
[h setClipsToBounds:YES];
CAGradientLayer *gradientLayer = [[CAGradientLayer alloc] init];
[gradientLayer setBounds:frame];
[gradientLayer setPosition:CGPointMake([h bounds].size.width/2, [h bounds].size.height/2)];
[gradientLayer setColors:[NSArray arrayWithObjects:
(id)[[UIColor colorWithRed:255 green:0 blue:255 alpha:0]CGColor],(id)[[UIColor blackColor] CGColor], nil]];
[[h layer] insertSublayer:gradientLayer atIndex:1];
//[h insertSubview:imgView atIndex:1];
[h setTag:0];
[h addTarget:self action:@selector(btnSelectColor:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:h];
//[imgView release];
[gradientLayer release];
这是我原始代码的canabalised版本(来自上一个问题),它的作用是将图像放在与渐变背景相同的水平。
在我之前的问题中,我提到了使用UIImageViews来完成大部分繁重工作的答案,除了我面临的问题是我必须创建多个UIImageViews 当我真的只需要创建一次。
这个想法是有4个按钮,每个按钮都有一个彩色背景,用户可以从中点击选择颜色方案。
有点难以解释,但我会尝试将其分解为一个列表。
frame
我希望这能澄清我的问题背景。
答案 0 :(得分:0)
也许有点偏离主题,但你确实意识到你可以通过简单地使用UIButton class的setImage:forState:方法在普通的UIButton上创建图形背景。
答案 1 :(得分:0)
http://coffeeshopped.com/2010/09/iphone-how-to-dynamically-color-a-uiimage
以上网址帮我解决了这个问题。
-(UIImage *)createGradientImage:(NSString *)name withTopColor:(CGColorRef)topColor withBottomColor:(CGColorRef)bottomColor
{
UIImage *image = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:name ofType:@"png"]];
// load the image
// begin a new image context, to draw our colored image onto
UIGraphicsBeginImageContext(image.size);
// get a reference to that context we created
CGContextRef context = UIGraphicsGetCurrentContext();
// set the fill color
//UIColor *color = [UIColor redColor];
//[color setFill];
// translate/flip the graphics context (for transforming from CG* coords to UI* coords
CGContextTranslateCTM(context, 0, image.size.height);
CGContextScaleCTM(context, 1.0, -1.0);
// set the blend mode to color burn, and the original image
//CGContextSetBlendMode(context, kCGBlendModeColorBurn);
//CGContextSetBlendMode(context, kCGBlendModeColor);
CGRect rect = CGRectMake(0, 0, image.size.width, image.size.height);
CGRect rectInternal = CGRectMake(3, 3, image.size.width-6, image.size.height-6);
//CGContextFillRect(context, rectInternal);
//CGColorRef topColor = [[UIColor colorWithRed:0.0 green:5.0 blue:0.0 alpha:1.0]CGColor];
//CGColorRef bottomColor = [[UIColor blackColor]CGColor];
NSArray *colors = [NSArray arrayWithObjects: (id)topColor, (id)bottomColor, nil];
CGFloat locations[] = {0, 1};
CGGradientRef gradient =
CGGradientCreateWithColors(CGColorGetColorSpace(topColor),
(CFArrayRef)colors, locations);
// the start/end points
CGPoint top = CGPointMake(CGRectGetMidX(rectInternal), rectInternal.origin.y);
CGPoint bottom = CGPointMake(CGRectGetMidX(rectInternal), CGRectGetMaxY(rectInternal));
// draw
CGContextDrawLinearGradient(context, gradient, top, bottom, 0);
CGGradientRelease(gradient);
//For fillcolors
//CGContextFillRect(context, rect);
CGContextDrawImage(context, rect, image.CGImage);
// set a mask that matches the shape of the image, then draw (color burn) a colored rectangle
//CGContextClipToMask(context, rect, image.CGImage);
//CGContextAddRect(context, rect);
//CGContextDrawPath(context,kCGPathFill);
// generate a new UIImage from the graphics context we drew onto
UIImage *coloredImg = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
//return the gradient image
return coloredImg;
}
线程关闭。