Установить для Layer Content значение UIImage внутри подкласса CALayer - не работает - PullRequest
0 голосов
/ 13 октября 2011

Я пытаюсь отобразить UIImage, выбранный из UIImagePickerController внутри подкласса CALayer, и добавить его в свой суперпредставление, но не могу заставить его работать.

Вот как я получаю изображение из UIImagePickerController, который, кажется, работает хорошо:

- (IBAction)importImage:(id)sender
{
    UIImagePickerController *imagePickerController = [[UIImagePickerController alloc] init];
    imagePickerController.delegate = self;
    imagePickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
    UIPopoverController *popover = [[UIPopoverController alloc] initWithContentViewController:imagePickerController];
    [popover setPopoverContentSize:CGSizeMake(320,320)];
    [popover presentPopoverFromRect:importBackgroundButton.frame inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];

    self.popoverController = popover;
    [imagePickerController  release];

}

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    [self.popoverController dismissPopoverAnimated:YES];

    UIImage* img = [info objectForKey:UIImagePickerControllerOriginalImage];
    [[context currentDrawing] setBkgImage:img];
}

Это мой подкласс CALayer, который содержит UIImage для отображения:

@interface UI_BackgroundImageLayer : CALayer
{
    //This is for the Import image as background feature
    UIImage* _bkgImg;
}

@property (nonatomic, retain) UIImage* _bkgImg;

-(void)update:(UIImage*)src;

@end


////

@implementation UI_BackgroundImageLayer

- (id)init
{
    self = [ super init ];

   // [self resetTransform ];

    _bkgImg = nil;

    return self;
}

-(void)update:(UIImage*)src
{
    _bkgImg = [[UIImage alloc] initWithCGImage:src.CGImage];


    self.contentsGravity = kCAGravityResizeAspect;
    self.contents = (id)_bkgImg.CGImage;
}
@end

Я обновляю содержимое CALayer, когда пользователь выбирает другое изображение!

CALayer добавляется в суперпредставление с самого начала следующим образом:

[[_superView layer] insertSublayer:context._imgLayer atIndex:0];

Он вставляется с индексом 0, потому что он должен быть фоновым изображением, поэтому он должен находиться под другими элементами пользовательского интерфейса и чертежами.

Мне все это кажется хорошим, но на экране ничего не появляется ...

1 Ответ

0 голосов
/ 06 ноября 2011

Вы используете XCode v4.2?Если это так, это может иметь отношение к вам или нет, но это стоит посмотреть.У меня была точно такая же проблема, как и у вас, когда подклассы CALayer не реагировали на обычные методы отображения (например, setCornerRadius, setBackgroundColor и т. Д.).Попробуй это;в своем представлении хостинга, сразу после того, как вы создали экземпляр VIEW, поместите следующую строку:

[self setBackgroundColor [UIColor clearColor]];

С этого момента вашподкласс слоя работает отлично.

Мой код подкласса вида выглядит следующим образом:

// layerClass
+ (Class) layerClass {
  return [myLayerSubclass class];
}


// View subclass init routine
- (id) initWithFrame: (CGRect) p_frame {
  self = [super initWithFrame: p_frame];

  if (self) {
    [self setBackgroundColor: [UIColor clearColor]];  // *** BUG WORKARUND? *** Note: Do Apple know about this?
    // Rest of your view init ....
  }

  return self;
}

Кажется, что подкласс слоя не отвечает, пока его хост-представление не "подтвердило", что оно там.Отладка заняла у меня несколько дней, но теперь весь мой код работает отлично.Надеюсь это поможет.VV

...