UIImagePickerController allowedEditing=YES 仅适用于视频

Posted

技术标签:

【中文标题】UIImagePickerController allowedEditing=YES 仅适用于视频【英文标题】:UIImagePickerController allowsEditing=YES just for video 【发布时间】:2013-12-04 11:01:04 【问题描述】:

我正在使用UIImagePickerController 让用户选择照片或视频。我面临的问题是,我使用自己的图像编辑器来处理照片,所以想要 allowsEditing=NO 来处理照片,但是视频必须有一定的长度,所以我想要 allowsEditing=YES 来处理视频。

为图像选择器设置videoMaximumDuration 可以在录制视频时正常工作,但如果从相机胶卷中选择,它只会在启用allowsEditing 时通知用户视频太长。

到目前为止,我可以在使用相机时通过监听ImageControlModeChanged 通知成功更改allowsEditing 属性。然后我可以使用以下方法更改属性:

- (void)imageCaptured:(NSNotification *)notification

    if (imagePicker.cameraCaptureMode == UIImagePickerControllerCameraCaptureModeVideo) 
        imagePicker.allowsEditing = YES;
     else 
        imagePicker.allowsEditing = NO;
    

但是,当从相机胶卷中选择时,这不起作用。我已经监控了通知,但看不到一个对更改 allowsEditing 属性有用的通知,具体取决于所选项目。

这可能吗?

谢谢

【问题讨论】:

【参考方案1】:

为什么不创建 2 个甚至 4 个 UIImagePickerControllers 而不是乱搞通知?

- (void) useCamera

    if ([UIImagePickerController isSourceTypeAvailable:
         UIImagePickerControllerSourceTypeCamera])
    
        UIImagePickerController *imagePicker =
        [[UIImagePickerController alloc] init];
        imagePicker.delegate = self;
        imagePicker.sourceType =
        UIImagePickerControllerSourceTypeCamera;
        imagePicker.mediaTypes = [NSArray arrayWithObjects:
                                  (NSString *) kUTTypeImage,
                                  nil];
        imagePicker.allowsEditing = NO;
        [self presentViewController:imagePicker animated:YES completion:nil];
    


- (void) useCameraRoll

    if ([UIImagePickerController isSourceTypeAvailable:
         UIImagePickerControllerSourceTypeSavedPhotosAlbum])
    
        UIImagePickerController *imagePicker =
        [[UIImagePickerController alloc] init];
        imagePicker.delegate = self;
        imagePicker.sourceType =
        UIImagePickerControllerSourceTypePhotoLibrary;
        imagePicker.mediaTypes = [NSArray arrayWithObjects:(NSString *) kUTTypeImage,nil];
        imagePicker.allowsEditing = NO;
        [self presentViewController:imagePicker animated:YES completion:nil];
    


- (void)videoRoll


    if ([UIImagePickerController isSourceTypeAvailable:
         UIImagePickerControllerSourceTypeSavedPhotosAlbum])
    
        UIImagePickerController *imagePicker =
        [[UIImagePickerController alloc] init];
        imagePicker.delegate = self;
        imagePicker.sourceType =
        UIImagePickerControllerSourceTypePhotoLibrary;
        imagePicker.mediaTypes = [NSArray arrayWithObjects:
                                  (NSString *) kUTTypeImage,
                                  nil];
        imagePicker.allowsEditing = YES;
        imagePicker.mediaTypes = [NSArray arrayWithObject:(NSString *)kUTTypeMovie];
        [self presentViewController:imagePicker animated:YES completion:nil];
    


- (void)vidCam

    if ([UIImagePickerController isSourceTypeAvailable:
         UIImagePickerControllerSourceTypeSavedPhotosAlbum])
    
        UIImagePickerController *imagePicker =
        [[UIImagePickerController alloc] init];
        imagePicker.delegate = self;
        imagePicker.sourceType =
        UIImagePickerControllerSourceTypeCamera;
        imagePicker.mediaTypes = [NSArray arrayWithObjects:
                                  (NSString *) kUTTypeImage,
                                  nil];
        imagePicker.allowsEditing = NO;
        imagePicker.mediaTypes = [NSArray arrayWithObject:(NSString *)kUTTypeMovie];
        [self presentViewController:imagePicker animated:YES completion:nil];
    

编辑:

在更好地理解了这个问题之后,我认为这是不可能的。您可以使用一些通知,但这些通知没有记录在任何地方,也没有在 ios7 上运行。如果真的是这样,我能想到的最好的解决方案是使用 github.com/andrei200287/SAVideoRangeSlider 和 allowsEditing = NO 之类的第 3 方。

【讨论】:

谢谢Sha,但这并不能解决问题。使用pictureRoll 时,我需要编辑=YES 用于视频,编辑=NO 用于照片 嗯,请参阅我编辑的答案。根据您的需要更改您的allowEditing。这涵盖了您可以从 cam\video 选择中获得的所有状态。 我可以确认上面的代码对我有用。使用相机胶卷中的视频,您将能够对其进行编辑。对于图片,您将无法编辑,并且选择器视图控制器将在选择图像时自行关闭。 是的,对于 4 个不同的场景有 4 个选择器,但是如何在它们之间切换?我不希望他们必须事先选择他们想要的媒体类型。他们启动相机胶卷,它同时显示视频和照片。如何限制照片不可编辑但视频可编辑? 在这种情况下,我能想到的唯一解决方案是使用第 3 方,例如 github.com/andrei200287/SAVideoRangeSlider,并且对于所有内容都允许编辑 = NO。【参考方案2】:

试试这个 在视图中分配属性确实加载了,而不是在 imageCaptured 方法中。它工作正常

 videoController.delegate = self;
    videoController.sourceType =UIImagePickerControllerSourceTypePhotoLibrary;
    videoController.mediaTypes = [UIImagePickerController availableMediaTypesForSourceType:videoController.sourceType];
    videoController.allowsEditing = YES;

【讨论】:

这有什么帮助?这只是将allowsEditing=YES 分配给任何不是我想要的选择或记录的内容。 @Aklesh 你介意解释你的解决方案吗?我不明白它与任何事情有什么关系。 @AkleshRathaur 将所有答案合并为一个。这没用。

以上是关于UIImagePickerController allowedEditing=YES 仅适用于视频的主要内容,如果未能解决你的问题,请参考以下文章

系统简单的UIImagePickerController

系统提供的UIImagePickerController

使用UIImagePickerController时3DTouch引起Crash

iOS-系统 图片视频 管理控制器UIImagePickerController

iOS7 UIImagePickerController取消按钮消失

使用UIImagePickerController时3DTouch引起的Crash问题的解决--备用