【问题标题】:Set Layer Content to UIImage inside a CALayer subclass - not working在 CALayer 子类中将图层内容设置为 UIImage - 不起作用
【发布时间】:2011-10-13 13:48:25
【问题描述】:

我正在尝试在 CALayer 的子类中显示从 UIImagePickerController 中选择的 UIImage 并将其添加到我的超级视图中,但我无法让它工作。

这就是我从 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 中:

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

它在索引 0 处插入,因为它是背景图像,因此它必须位于其他 UI 元素和绘图之下。

这一切对我来说似乎都很好,但屏幕上什么也没有出现……

【问题讨论】:

  • 是否要求插入图像作为视图的背景?
  • 不确定您的意思...该操作基于工具栏中包含的按钮(即 UIViewController)。然后将 UIImagePickerController 的结果发送到我的应用程序“上下文”,该应用程序服务于整个程序。
  • 我已经通过直接在 open gl 中显示我的背景图像解决了我的问题。如果有人需要代码,请告诉我,我可以写一篇关于如何执行此操作的帖子。

标签: iphone ipad uikit core-animation calayer


【解决方案1】:

您使用的是 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;
}

似乎图层子类在其托管视图“确认”它存在之前不会响应。我花了几天的时间来调试,但现在我所有的代码都能完美运行。 希望这可以帮助。 V.V.

【讨论】:

  • 我在其他一些帖子中看到调用 self.view 也可以。它强制 layerClass 调用它的 viewDidLoad 方法并正确完成初始化。
猜你喜欢
  • 1970-01-01
  • 2013-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-11
  • 1970-01-01
相关资源
最近更新 更多