目标C - 事件之后的addSubView在AVCaptureVideoPreviewLayer之上

时间:2013-06-20 13:20:51

标签: objective-c nsnotificationcenter addsubview

早上好, 我通过ViewController类中的方法startPreview将AVCaptureVideoPreviewLayer添加到我的视图中。

- (void) startPreview
{
    preview = [[CameraEngine engine] getPreviewLayer];
    [preview removeAllAnimations];

    preview.frame = self.imageView.bounds;
    [[preview connection] setVideoOrientation:AVCaptureVideoOrientationPortrait];

    [self.cameraView.layer addSublayer:preview];
    [self.imageView.layer addSublayer:preview];    
}

然后我有以下方法将图标添加到视图

- (void)addIcon:(NSNotification *)notification{

   UIView* iview;

   NSDictionary* userInfo2 = [notification userInfo];
   int originX = [userInfo2[@"originX"]intValue];
   int originY = [userInfo2[@"originY"]intValue];

   iview = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"mouse_ico.png"]];

   [iview setFrame:CGRectMake(0,0, iview.frame.size.width/4, iview.frame.size.height/4)];
   [iview setUserInteractionEnabled:NO];
   [self.view addSubview:iview];
   [self.view setNeedsDisplay];
}

如果我通过代码

调用方法“addIcon”
[self addIcon:(NSNotification*)nil];

从方法“startPreview它正常工作。 当我从另一个班级等待事件时,图标不会出现。 我调试了代码并正确触发了事件,并调用了方法addIcon。 当从startPreview到达addIcon并且NotificationCenter触发时,“self.view”具有相同的内存地址。

谢谢

1 个答案:

答案 0 :(得分:1)

检查您的addIcon方法是否始终在调试器的主线程中运行。在后台线程上更新ui元素可以产生您看到的结果,并且不应该以这种方式完成。

以下是如何打包视图更新代码以便它始终在主线程上运行的示例。

dispatch_async(dispatch_get_main_queue(), ^{
        //put update view code in here
    });