Iphone 照相机覆盖图片
编辑3 好消息和坏消息。好消息是,在Connections Inspector中,通过断开覆盖UIToolbar并连接UIImageview,我看到了国王,但坏消息是,我没有看到我也需要的UIToolbar。所以现在的问题是,当用户在这里完成时,如何才能回到调用VC?工具栏和图像怎么可能都是覆盖的一部分,或者“返回按钮”工具栏怎么可能位于非覆盖视图上,或者什么的?或者如何使工具栏和图像都显示在OverlyViewController上 编辑3 编辑2Iphone 照相机覆盖图片,iphone,ios,xcode,uiimagepickercontroller,Iphone,Ios,Xcode,Uiimagepickercontroller,编辑3 好消息和坏消息。好消息是,在Connections Inspector中,通过断开覆盖UIToolbar并连接UIImageview,我看到了国王,但坏消息是,我没有看到我也需要的UIToolbar。所以现在的问题是,当用户在这里完成时,如何才能回到调用VC?工具栏和图像怎么可能都是覆盖的一部分,或者“返回按钮”工具栏怎么可能位于非覆盖视图上,或者什么的?或者如何使工具栏和图像都显示在OverlyViewController上 编辑3 编辑2 OverlayViewController.
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];
}
}
}
编辑2
编辑1
编辑1
编辑0
有没有人在iPhone而不是iPad上试过这个?我没有iPhone,但我今天读了Matt Neuburg的书,他说UIImagePicker在这两款设备上的工作方式不同
编辑0
在UIImagePicker中,我无法看到试图覆盖在摄影机视图上的图像。无论我如何添加IBOutlet,无论是否作为属性,图像都不会显示,但覆盖的工具栏显示良好。为什么?
在苹果的示例代码中添加了带国王的IBOutlet的viewcontroller.h,然后暂时将其注释掉
#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
当我在iPhone上执行代码时,我看不到King的图像。下面是我添加的nib视图,显示了一些连接。没有抛出错误,但我看不到图像,只有UIToolbar已经添加
更新
我现在已经更新了它,并试图复制您在问题中所做的。我已经包括了.h/.m和
theKing@2x.png
。创建一个新项目并将源文件粘贴到文件中,然后添加theKing@2x.png
。一切都是以编程方式完成的-除了将视图嵌入到导航控制器中之外,您不需要在interface builder中进行任何设置
这里是theKing@2x.png
-
ViewController.h
截图
这就是我运行它时的样子。
这是否满足您的应用程序要求?我发现的一个答案是将图像放在一个巨大的按钮上,该按钮作为动作
完成:
。我必须想办法告诉我的用户这样做,但至少这会关闭图像视图并完成我的设置模式。我真的希望有一个更干净的选择,所以请添加答案,如果你有他们。感谢所有考虑过我的问题的人。很抱歉花了这么长时间才回复。到目前为止,我只遇到了一个错误“selectorsetCameraOverlayView的类未知”,由于其他义务,我无法研究该问题。您能看看-OverlayViewController.m
中的设置图像选择器:
吗?我将把它添加到问题中。谢谢你的回答。你能把你的消息来源压缩并发布吗?今晚我可以看一看。今天的大部分时间我都很忙,但是当我今晚回家的时候,我很乐意看一看。我想我要到星期天晚上才能使用我的电脑。那我就把拉链拉上寄给你。谢谢。我现在已经更新了它,并试图复制你在问题中所做的。我已经包括了.h/.m和theKing@2x.png
。创建一个新项目并粘贴此代码。一切都是以编程方式完成的-您不需要在interface builder中进行任何设置。这是否满足了您的问题?移除按钮?删除viewDidLoad
中与按钮相关的代码,然后将代码从buttonPress
移动到viewDidLoad
。或者,您也可以在viewDidLoad
中使用[self-buttonPress:self]
调用buttonPress
。
#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;
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController <UIImagePickerControllerDelegate, UINavigationControllerDelegate>
@end
#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