Почему я не могу использовать один UIImageView более чем на 1 кнопку? - PullRequest
0 голосов
/ 05 января 2011

У меня проблема со следующим кодом.

Я хочу использовать один UIImageView для более чем 1 кнопки, мне кажется логичным определить 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];

Редактировать:

Контекст

Я добавил контекст к своему вопросу

Я пытаюсь создать изображение с градиентным фоновым слоем, которое находится за фактическим изображением, и является дополнительным вопросом к этому (URL: Создание кнопки прозрачного изображения с помощью 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, когда мне действительно нужно создать его один раз.

Идея состоит в том, чтобыбушельттоны, каждый из которых имеет цветной фон, из которого пользователь может щелкнуть, чтобы выбрать свою цветовую схему.

Это немного сложно объяснить, но я постараюсь разбить его на список.

  1. Изображение (аватар) является верхним слоем
  2. Градиентный фон находится на заднем плане и превращается в frame
  3. Весь объект кликабелен
  4. Мне нужно только инициировать 1 UIImageView каждый раз, когда я хочу его использовать, но вынужден создавать несколько копий одного и того же UIImageView.

Надеюсь, это проясняет контекст моей проблемы.

Ответы [ 2 ]

0 голосов
/ 14 января 2011

http://coffeeshopped.com/2010/09/iphone-how-to-dynamically-color-a-uiimage

Приведенный выше URL помог мне решить проблему сейчас.

-(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;
}

Тема закрыта.

0 голосов
/ 05 января 2011

Возможно, немного не по теме, но вы понимаете, что вы можете создать графический фон на обычной кнопке UIB, просто используя setImage: forState: метод класса UIButton .

...