【问题标题】:Can't present imagepicker immediately无法立即呈现图像选择器
【发布时间】:2015-03-08 04:44:32
【问题描述】:

我有一个标签栏控制器,当我点击第三个标签栏按钮时,我会显示一个UIViewcontroller。在这个 vc 的 viewWillAppear 中,我展示了一个运行良好的 UIImagepickerController。问题是我打开视图时无法立即在屏幕上显示它。首先出现 vc,然后在 0.4-0.5 秒后出现图像选择器。所以我想先展示图像选择器,然后在用户拍摄图像后展示 vc。我也尝试从viewDidLoadviewWillAppear 调用选择器,但没有任何改变。

- (void)viewWillAppear:(BOOL)animated {

    [super viewWillAppear:animated];

    if (imagePickerWasPresented == NO)
    {
        imagePickerWasPresented = YES;

        self.imagePicker = [[UIImagePickerController alloc] init];
        self.imagePicker.delegate = self;
        self.imagePicker.allowsEditing = YES;


        self.imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
        self.imagePicker.mediaTypes = [NSArray arrayWithObject:(NSString *)kUTTypeImage];

        [self presentViewController:self.imagePicker animated:NO completion:nil];
    }
}

我是不是在错误的地方调用它?

【问题讨论】:

    标签: ios objective-c uiviewcontroller uiimagepickercontroller


    【解决方案1】:

    不,你在合适的地方调用它,这就是 iOS 的做法;如果您将多个模态呈现在彼此之上,则一个接一个呈现,包括动画。一个可以解决您的问题的解决方案是提供一个 UINavigationController 而不是您的 UIViewController。将导航控制器设置为将 ViewController 作为根视图控制器,但还将您的 imagepickercontroller 推送到堆栈上。展示这个导航控制器,它应该直接进入你的图像选择器控制器。否则,请尝试同时显示 uiviewcontroller 和 imagepickercontroller,并将动画设置为 NO,看看是否有效。

    【讨论】:

      【解决方案2】:

      试试这个,看看你有多接近然后适应你的需求。当我对其进行快速测试时,它似乎可以满足您的要求。

      - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
      
          self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] ;
      
          UIViewController * vc = [[UIViewController alloc] init];
      
          vc.view.backgroundColor = [UIColor whiteColor];
      
          UINavigationController * navigationController = [[UINavigationController alloc] init];
          [navigationController pushViewController:vc animated:NO];
      
      
          UITabBarController * tabBarController = [[UITabBarController alloc] init];
          NSArray* controllers = [NSArray arrayWithObjects:navigationController, nil];
          tabBarController.viewControllers = controllers;
      
          tabBarController.delegate = self;
      
          UIImagePickerController *imagePicker =
          [[UIImagePickerController alloc] init];
          imagePicker.delegate = self;
          imagePicker.sourceType =
          UIImagePickerControllerSourceTypePhotoLibrary;
          imagePicker.mediaTypes = [NSArray arrayWithObjects:
                                (NSString *) kUTTypeImage,
                                nil];
          imagePicker.allowsEditing = NO;
      
          self.window.rootViewController = tabBarController;
      
          [self.window makeKeyAndVisible];
      
          [vc presentViewController:imagePicker animated:NO completion:nil];
      
          return YES;
      
      }
      

      【讨论】:

      • 我应该添加这也非常清楚地说明了 Alex 提到的关于将视图控制器推送到添加到标签栏控制器的导航控制器的内容。
      • 我还有 3 种不同的方法可以与 vc 中的图像选择器交互,所以我宁愿忽略 AppDelegate。
      • 然后将委托设置为vc
      【解决方案3】:

      我遇到了同样的问题 - 不是先调用 VC,然后再调用 UIImagePicker,而是直接调用 UIImagePicker。

      当你拍完照片/视频后:

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

      您将使用这个标准委托方法,从这里调用 VC。这样,您将立即转到 ImagePicker,并且只有一个过渡,您会选择在之后对所拍摄的内容做一些事情,这不那么令人沮丧/难看。

      【讨论】:

        【解决方案4】:

        UIImage 作为 PopOver

        图库模式:

        BOOL hasGallery = [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary];
        UIImagePickerController* picker = [[UIImagePickerController alloc] init];
        picker.delegate = self;
        picker.sourceType = hasGalleryt ? UIImagePickerControllerSourceTypePhotoLibrary :    UIImagePickerControllerSourceTypePhotoLibrary;
        if (self.popoverController != nil)
        {
            [self.popoverController dismissPopoverAnimated:YES];
            self.popoverController=nil;
        }
        self.popoverController = [[UIPopoverController alloc] initWithContentViewController:picker];
        CGRect popoverRect = [self.view convertRect:[self.imageView frame]
                                           fromView:[self.imageView superview]];
        popoverRect.size.width = MIN(popoverRect.size.width, 300) ;
        popoverRect.origin.x = popoverRect.origin.x;
        [self.popoverController
         presentPopoverFromRect:popoverRect
         inView:self.view
         permittedArrowDirections:UIPopoverArrowDirectionAny
         animated:YES];
        

        拍照模式:

        BOOL hasCamera = [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera];
        UIImagePickerController* picker = [[UIImagePickerController alloc] init];
        picker.delegate = self;
        picker.sourceType = hasCamera ? UIImagePickerControllerSourceTypeCamera :    UIImagePickerControllerSourceTypePhotoLibrary;
        if (self.popoverController != nil)
        {
            [self.popoverController dismissPopoverAnimated:YES];
            self.popoverController = nil;
        }
        self.popoverController = [[UIPopoverController alloc] initWithContentViewController:picker];
        CGRect popoverRect = [self.view convertRect:[self.imageView frame]
                                           fromView:[self.imageView superview]];
        popoverRect.size.width = MIN(popoverRect.size.width, 300) ;
        popoverRect.origin.x = popoverRect.origin.x;
        [self.popoverController
         presentPopoverFromRect:popoverRect
         inView:self.view
         permittedArrowDirections:UIPopoverArrowDirectionAny
         animated:YES];
        

        记得给.h文件@interface代表,像这样:

        @interface the UIViewController: UIViewController <UIPopoverControllerDelegate, UIImagePickerControllerDelegate>
        

        【讨论】:

        • 你能链接一个样本吗?我从来没有把它做成 PopOver。
        猜你喜欢
        • 1970-01-01
        • 2015-06-27
        • 2020-11-09
        • 2019-07-22
        • 2013-05-29
        • 2015-09-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多