简体   繁体   English

相机叠加图片

[英]camera overlay picture

edit 3 编辑3

Good news and bad news. 好消息和坏消息。 The good news is that in the Connections Inspector by disconnecting the overlay UIToolbar and connecting the UIImageview, I see theKing , but then -- the bad news -- I do not see the UIToolbar, which I also need. 好消息是,在Connections Inspector中,通过断开覆盖UIToolbar并连接UIImageview,我看到了theKing ,但后来 - 坏消息 - 我没有看到UIToolbar,我也需要它。 So the question now is, how can the user get back to the calling VC when s/he is finished here? 所以现在的问题是,用户如何在他/她完成时回到调用VC? How can both the toolbar and the image be part of the the overlay, or can the "go back button" toolbar be on the non-overlay view, or something? 如何将工具栏和图像都作为叠加层的一部分,或者“返回按钮”工具栏是否可以位于非叠加视图上,或者某些东西? Or how can I make both the toolbar and the image show on the OverlayViewController? 或者如何在OverlayViewController上同时显示工具栏和图像?

edit 3 编辑3

edit 2 编辑2

setupImagePicker in OverlayViewController.m . OverlayViewController.m setupImagePicker

- (void)setupImagePicker:(UIImagePickerControllerSourceType)sourceType
{
    self.imagePickerController.sourceType = sourceType;

    if (sourceType == UIImagePickerControllerSourceTypeCamera)
    {
        // user wants to use the camera interface
        //
        self.imagePickerController.showsCameraControls = NO;

        if ([[self.imagePickerController.cameraOverlayView subviews] count] == 0)
        {
            // setup our custom overlay view for the camera
            //
            // ensure that our custom view's frame fits within the parent frame
            CGRect overlayViewFrame = self.imagePickerController.cameraOverlayView.frame;
            CGRect newFrame = CGRectMake(0.0,
                                         CGRectGetHeight(overlayViewFrame) -
                                         self.view.frame.size.height - 10.0,
                                         CGRectGetWidth(overlayViewFrame),
                                         self.view.frame.size.height + 10.0);
            self.view.frame = newFrame;
            [self.imagePickerController.cameraOverlayView addSubview:self.view];
        }
    }
}

edit 2 编辑2

edit 1 编辑1

This is the PhotoPicker sample code link . 这是PhotoPicker示例代码链接

edit 1 编辑1

edit 0 编辑0

Has anyone tried this on an iPhone instead of an iPad? 有没有人在iPhone而不是iPad上试过这个? I do not have an iPhone, but I was reading Matt Neuburg's book today where he says UIImagePicker works differently on the 2 devices. 我没有iPhone,但我今天正在阅读Matt Neuburg的书,他说UIImagePicker在2台设备上的工作方式不同。

edit 0 编辑0

I cannot see the image I am attempting to overlay across the camera view in UIImagePicker. 我无法在UIImagePicker中看到我试图覆盖整个摄像机视图的图像。 No matter how I add the IBOutlet, as a property or not, the image does not show, but the overlayed toolbar shows fine. 无论我如何添加IBOutlet作为属性,图像都不会显示,但覆盖的工具栏显示正常。 Why? 为什么?

OverlayViewController.h with theKing IBOutlet added to Apple's sample code and then commented out for now. 将带有theKing IBOutlet的OverlayViewController.h添加到Apple的示例代码中,然后theKing注释掉。

#import <UIKit/UIKit.h>
#import <AudioToolbox/AudioServices.h>

@protocol OverlayViewControllerDelegate;

@interface OverlayViewController : UIViewController <UINavigationControllerDelegate, UIImagePickerControllerDelegate>
{
    // IBOutlet UIImageView* theKing;   ******** temporarily commented out
    id <OverlayViewControllerDelegate> delegate;
}    

@property (nonatomic, assign) id <OverlayViewControllerDelegate> delegate;
@property (nonatomic, retain) UIImagePickerController *imagePickerController;

- (void)setupImagePicker:(UIImagePickerControllerSourceType)sourceType;

@end

@protocol OverlayViewControllerDelegate
- (void)didTakePicture:(UIImage *)picture;
- (void)didFinishWithCamera;
@end

OverlayViewController.m with the property for theKing IBOutlet added to Apple's sample code. theKingtheKing IBOutlet的property添加到Apple的示例代码中。

#import "OverlayViewController.h"

enum
{
    kOneShot,       // user wants to take a delayed single shot
    kRepeatingShot  // user wants to take repeating shots
};

@interface OverlayViewController ( )

@property (assign) SystemSoundID tickSound;

@property (nonatomic, retain) IBOutlet UIImageView* theKing;  // added *********
@property (nonatomic, retain) IBOutlet UIBarButtonItem *takePictureButton;
@property (nonatomic, retain) IBOutlet UIBarButtonItem *startStopButton;
@property (nonatomic, retain) IBOutlet UIBarButtonItem *timedButton;
@property (nonatomic, retain) IBOutlet UIBarButtonItem *cancelButton;

@property (nonatomic, retain) NSTimer *tickTimer;
@property (nonatomic, retain) NSTimer *cameraTimer;

I cannot see the image theKing when I execute the code on an iPhone. 当我在iPhone上执行代码时,我看不到图像theKing Below is a view of the nib I have added showing some of the connections made. 下面是我添加的笔尖视图,显示了一些连接。 No errors are thrown, but I cannot see the image, only the UIToolbar already added. 没有错误,但我看不到图像,只添加了UIToolbar。

覆盖控制器的笔尖

Update 更新

I've updated it now and tried to replicate what you've done in your question. 我现在更新了它并尝试复制你在问题中所做的事情。 I've included full source of .h/.m and theKing@2x.png . 我已经包含.h / .m和theKing@2x.png完整来源。 Create a new project and paste the source into the files and add theKing@2x.png . 创建一个新项目并将源粘贴到文件中并添加theKing@2x.png Everything is done programmatically - you don't need to set anything up in interface builder other than embedding your view in a navigation controller. 一切都是以编程方式完成的 - 除了将视图嵌入导航控制器之外,您无需在界面构建器中设置任何内容。

Here is theKing@2x.png - http://i.imgur.com/0DrM7si.png 这是theKing@2x.png - http://i.imgur.com/0DrM7si.png

ViewController.h ViewController.h

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <UIImagePickerControllerDelegate, UINavigationControllerDelegate> 

@end

ViewController.m ViewController.m

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    // assign action to button
    UIButton *myButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    myButton.frame = CGRectMake(0, 0, 200, 60);
    myButton.center = self.view.center;
    [myButton addTarget:self action:@selector(buttonPress:) forControlEvents:UIControlEventTouchUpInside];
    [myButton setTitle:@"Image Picker" forState:UIControlStateNormal];

    [self.view addSubview:myButton];
}

- (void)buttonPress:(id)sender {
    if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {

        // alert the user that the camera can't be accessed
        UIAlertView *noCameraAlert = [[UIAlertView alloc] initWithTitle:@"No Camera" message:@"Unable to access the camera!" delegate:nil cancelButtonTitle:@"Dismiss" otherButtonTitles:nil, nil];
        [noCameraAlert show];

    } else {

        // prepare imagePicker view
        UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
        imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
        imagePicker.delegate = self;
        imagePicker.allowsEditing = NO;
        imagePicker.showsCameraControls = NO;

        // create view for overlay
        CGRect overlayRect = CGRectMake(0, 0, imagePicker.view.frame.size.width, imagePicker.view.frame.size.height);
        UIView *overlayView = [[UIView alloc] initWithFrame:overlayRect];

        // prepare the image to overlay
        UIImageView *overlayImage = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"theKing"]];
        overlayImage.center = overlayView.center;
        overlayImage.alpha = 0.5;

        // prepare toolbar for overlay
        UIToolbar *overlayToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 600, overlayView.frame.size.width, 40)];
        overlayToolbar.center = CGPointMake(overlayView.center.x, overlayView.frame.size.height - 20);
        overlayToolbar.barStyle = UIBarStyleBlack;

        UIBarButtonItem *takePictureButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCamera target:self action:@selector(takePictureButtonPressed:)];
        UIBarButtonItem *flexibleBarSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
        flexibleBarSpace.width = 1000;
        UIBarButtonItem *startStopButton = [[UIBarButtonItem alloc] initWithTitle:@"Snap" style:UIBarButtonItemStyleBordered target:self action:@selector(startStopButtonPressed:)];
        UIBarButtonItem *timedButton = [[UIBarButtonItem alloc]initWithTitle:@"Timed" style:UIBarButtonItemStyleBordered target:self action: @selector(timedButtonPressed:)];
        UIBarButtonItem *cancelButton = [[UIBarButtonItem alloc]initWithTitle:@"Cancel" style:UIBarButtonItemStyleBordered target:self action: @selector(cancelButtonPressed:)];

        overlayToolbar.items = [NSArray arrayWithObjects:takePictureButton, flexibleBarSpace, startStopButton, timedButton, cancelButton, nil];


        [overlayView addSubview:overlayImage];
        [overlayView addSubview:overlayToolbar];

        // add the image as the overlay
        [imagePicker setCameraOverlayView:overlayView];

        // display imagePicker
        [self.navigationController presentViewController:imagePicker animated:YES completion:nil];
    }
}

#pragma mark - UIBarButton Selectors

- (void)takePictureButtonPressed:(id)sender {
    NSLog(@"takePictureButtonPressed...");
    // TODO: take picture!
}

- (void)startStopButtonPressed:(id)sender {
    NSLog(@"startStopButtonPressed...");
    // TODO: make this do something
}

- (void)timedButtonPressed:(id)sender {
    NSLog(@"timedButtonPressed...");
    // TODO: implement timer before calling takePictureButtonPressed
}

- (void)cancelButtonPressed:(id)sender {
    NSLog(@"cancelButtonPressed");
    [self.navigationController dismissViewControllerAnimated:YES completion:nil];
}

#pragma mark - UIImagePickerController Delegate Methods

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)editingInfo {

    // determine if the user selected or took a new photo
    UIImage *selectedImage;
    if ([editingInfo objectForKey:UIImagePickerControllerOriginalImage]) selectedImage = (UIImage *)[editingInfo objectForKey:UIImagePickerControllerOriginalImage];
    else if ([editingInfo objectForKey:UIImagePickerControllerEditedImage]) selectedImage = (UIImage *)[editingInfo objectForKey:UIImagePickerControllerEditedImage];

    // TODO: Do something with selectedImage (put it in a UIImageView

    // dismiss the imagePicker
    [picker.presentingViewController dismissViewControllerAnimated:YES completion:nil];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

Screenshot 截图

This is what it looks like when I run it. 这就是我运行时的样子。 截图

Does this satisfy your app requirements? 这是否满足您的应用程序要求?

One answer I have found is to put the image on a huge button which has as an action Done: . 我找到的一个答案是将图像放在一个巨大的按钮上,该按钮具有以下动作Done: I'll have to figure out a way to tell my user to do it, but at least this will dismiss the image view and finish my setup mode. 我必须想办法告诉我的用户这样做,但至少这会解雇图像视图并完成我的设置模式。 I would really like a cleaner alternative, so please add answers if you have them. 我真的想要一个更清洁的替代品,所以如果你有它们,请添加答案。 Thanks to all who have considered my question. 感谢所有考虑过我的问题的人。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM