问题描述
我在使用以下代码时遇到问题.
I'm having a problem with the following code.
我想在 1 个以上的按钮上使用一个 UIImageView,对我来说只定义一次 UIImageView 并根据需要多次使用它似乎合乎逻辑.
I want to use one UIImageView on more than 1 button, it seems logical to me to only define the UIImageView once and use it as many times as necessary.
如果我尝试将 imgView1 附加到两个不同的按钮,则只会显示其中一个.
If I try to attach the imgView1 to two different buttons only one of them is displayed.
我可以通过使用注释掉的 imgView2 来解决这个问题.
I can get round this by using the commented out imgView2.
但是我必须这样做似乎很愚蠢.为什么我不能只拥有一个 UIImageView,然后根据需要将其添加到任意数量的视图中?
But it seems silly that I have to do this. Why can't I just have one UIImageView and then add it to as many views as I require?
// 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];
背景
我为我的问题添加了一些上下文
I've added some Context to my question
我正在尝试创建一个带有位于实际图像后面的渐变背景层的图像,这是该图像的后续问题(URL:使用 bgcolor 制作透明图像按钮)
I am trying to create an image with a gradient background layer that sits behind the actual image, and is a follow-up question to this one (URL: Making a Transparent image button with bgcolor)
虽然我可以简单地使用 setImage,但它不会将渐变背景图层放入背景中.
Whilst I can simply use setImage, it will not put the gradient background layer into the background.
例如:
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 版本(来自上一个问题),它的作用是将图像置于与我的渐变背景相同的级别.
This is a canabalised version of my original code (from previous question), what its doing is its putting the image at the same level as my gradient background.
在我之前的问题中,我提到了使用 UIImageViews 来完成大部分繁重工作的答案,但我面临的问题是我必须创建多个 UIImageViews当我真的只需要创建一次时.
In my previous question I alluded to the answer of using UIImageViews to do most of the heavy lifting, except the problem I'm facing is that I have to create multiple UIImageViewswhen I really just need to create it once.
这个想法是有 4 个按钮,每个按钮都有一个彩色背景,用户可以从中选择他们的配色方案.
The idea is to have 4 buttons, each with a colored background from which the user can click to choose their color scheme.
这有点难以解释,但我会试着把它分解成一个列表.
Its a bit hard to explain, but I'll try and break it down into a list.
- 图像(头像)是顶层
- 渐变背景在背景中并强制进入
frame
- 整个对象都是可点击的
- 每次我想使用它时只需要初始化 1 个 UIImageView,但我不得不创建同一个 UIImageView 的多个副本.
我希望这能澄清我的问题的背景.
I hope this clarifies the context of my problem.
推荐答案
http://coffeeshopped.com/2010/09/iphone-how-to-dynamically-color-a-uiimage
上面的网址现在帮我解决了这个问题.
The above URL helped me resolve the problem now.
-(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;
}
线程已关闭.
这篇关于为什么我不能在 1 个以上的按钮上使用一个 UIImageView?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!