2016-04-07 6 views
0

Xcode 7.3, iOS 9.3.1iOS, UIImagePickerController, gibt es eine Möglichkeit zu erkennen, wenn der Benutzer auf die Schaltfläche zum Aufnehmen von Bildern klickt, ohne benutzerdefinierte Steuerelemente zu implementieren?

Ich mag zwei benutzerdefinierten Überlagerungsansichten verwenden, wenn der Benutzer über ein Bild zu machen und nach, während der Bildbearbeitung. Um das Overlay zu ändern, würde ich gerne wissen, ob es eine Callback-Methode von UIImagePickerControllerDelegate gibt, die mich wissen lässt, wenn der Benutzer mit der Bearbeitung des Bildes beginnt oder wenn der Benutzer auf den Take-Button geklickt hat.

Die einzigen Methoden, die ich kenne, sind:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info 

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker 

Ich habe hier sah: UIImagePickerController with cameraOverlayView focusses when button in overlay is tapped, How to know I tap "taking photo button" with UIImagePicker und iOS - Taking A Picture After Button Tap in UIImagePickerController CustomOverlayView.

Oder vielleicht gibt es eine Möglichkeit, das Antippen-Ereignis von der Standardschaltfläche zu erhalten, indem Sie einen Beobachter hinzufügen.

Bitte helfen! Danke im Voraus.

Antwort

1

Xcode 8.2.1, iOS10.2.1

Bevor die Lösung für frühere Version lesen Implementierung finden Sie in die Grundlagen zu verstehen. Vielen Dank! Das Problem war, dass einige der Namen für verschiedene Subviews von iOS 9.3.1 auf iOS 10.2.1 geändert wurden. Hier

ist der vollständige Code (siehe unten, wo einfügen), die "//-Code geht hier" unten ersetzt:

for (UIView *subviewImagePickerControllerView in self.imagePickerController.view.subviews) 
{ 
    if ([subviewImagePickerControllerView.class.description isEqualToString:@"UINavigationTransitionView"]) 
    { 
     for (UIView *subviewUINavigationTransitionView in subviewImagePickerControllerView.subviews) 
     { 
      if ([subviewUINavigationTransitionView.class.description isEqualToString:@"UIViewControllerWrapperView"]) 
      { 
       for (UIView *subviewUIViewControllerWrapperView in subviewUINavigationTransitionView.subviews) 
       { 
        if ([subviewUIViewControllerWrapperView.class.description isEqualToString:@"CAMCameraViewControllerContainerView"]) 
        { 
         for (UIView *subviewCAMCameraViewControllerContainerView in subviewUIViewControllerWrapperView.subviews) 
         { 
          if ([subviewCAMCameraViewControllerContainerView.class.description isEqualToString:@"CAMViewfinderView"]) 
          { 
           for (UIView *subviewCAMViewfinderView in subviewCAMCameraViewControllerContainerView.subviews) 
           { 
            if ([subviewCAMViewfinderView.class.description isEqualToString:@"CAMBottomBar"]) 
            { 
             for (UIView *subviewCAMBottomBar in subviewCAMViewfinderView.subviews) 
             { 
              if ([subviewCAMBottomBar.class.description isEqualToString:@"CUShutterButton"] && [subviewCAMBottomBar.class isSubclassOfClass:[UIButton class]]) 
              { 
               UIButton *shutterButton = (UIButton *)subviewCAMBottomBar; 

               [shutterButton addTarget:self action:@selector(touchUpInsideCMKShutterButton) forControlEvents:UIControlEventTouchUpInside]; 
              } 
              else 
              { 
               nil; 
              } 
             } 
            } 
           } 

          } 
          else if ([subviewCAMCameraViewControllerContainerView.class.description isEqualToString:@"PLCropOverlay"]) 
          { 
           for (UIView *subviewPLCropOverlay in subviewCAMCameraViewControllerContainerView.subviews) 
           { 
            if ([subviewPLCropOverlay.class.description isEqualToString:@"PLCropOverlayBottomBar"]) 
            { 
             for (UIView *subviewPLCropOverlayBottomBar in subviewPLCropOverlay.subviews) 
             { 
              if ([subviewPLCropOverlayBottomBar.class.description isEqualToString:@"PLCropOverlayPreviewBottomBar"]) 
              { 
               for (UIView *itemPLCropOverlayPreviewBottomBar in subviewPLCropOverlayBottomBar.subviews) 
               { 
                if ([itemPLCropOverlayPreviewBottomBar.class isSubclassOfClass:[UIButton class]]) 
                { 
                 UIButton *buttonPLCropOverlay = (UIButton *)itemPLCropOverlayPreviewBottomBar; 

                 if ([buttonPLCropOverlay.titleLabel.text isEqualToString:@"Retake"]) 
                 { 
                  UIButton *retakeButton = buttonPLCropOverlay; 

                  [retakeButton addTarget:self action:@selector(touchUpInsideButtonRetake) forControlEvents:UIControlEventTouchUpInside]; 
                 } 
                 else 
                 { 
                  nil; 
                 } 
                } 
                else 
                { 
                 nil; 
                } 
               } 
              } 
              else 
              { 
               nil; 
              } 
             } 
            } 
            else 
            { 
             nil; 
            } 
           } 
          } 
          else 
          { 
           nil; 
          } 
         } 
        } 
        else 
        { 
         nil; 
        } 
       } 
      } 
      else 
      { 
       nil; 
      } 
     } 
    } 
    else 
    { 
     nil; 
    } 
} 

Xcode 7.3, iOS9.3.1

Ich musste Damit das funktioniert, habe ich viel Zeit damit verbracht, das herauszufinden.

Das Wesentliche davon ist, ich Drill-down die Ansichtshierarchie nach der UIImagePickerController präsentiert wurde, auf der Suche nach CMKShutterButton und die Wiederholung Schaltfläche mit einem Titel "Retake", dann ich einen Selektor an die Schaltflächen 'Aktion, so ...

[shutterButton addTarget:self action:@selector(touchUpInsideCMKShutterButton) forControlEvents:UIControlEventTouchUpInside]; 

[retakeButton addTarget:self action:@selector(touchUpInsideButtonRetake) forControlEvents:UIControlEventTouchUpInside]; 

Lassen Sie den Code unten in den Abschluss-Block, der nach dem Bild Picker präsentiert aufgerufen wird:

[self presentViewController:self.imagePickerController animated:true completion:^(void){ 

    //Code goes here 

} 

Hier ist die komplette Code, die "//-Code geht hier" oben ersetzt:

for (UIView *subviewImagePickerControllerView in self.imagePickerController.view.subviews) 
{ 
    if ([subviewImagePickerControllerView.class.description isEqualToString:@"UINavigationTransitionView"]) 
    { 
     for (UIView *subviewUINavigationTransitionView in subviewImagePickerControllerView.subviews) 
     { 
      if ([subviewUINavigationTransitionView.class.description isEqualToString:@"UIViewControllerWrapperView"]) 
      { 
       for (UIView *subviewUIViewControllerWrapperView in subviewUINavigationTransitionView.subviews) 
       { 
        if ([subviewUIViewControllerWrapperView.class.description isEqualToString:@"PLImagePickerCameraView"]) 
        { 
         for (UIView *subviewPLImagePickerCameraView in subviewUIViewControllerWrapperView.subviews) 
         { 
          if ([subviewPLImagePickerCameraView.class.description isEqualToString:@"CMKBottomBar"]) 
          { 
           for (UIView *itemCMKBottomBar in subviewPLImagePickerCameraView.subviews) 
           { 
            if ([itemCMKBottomBar.class.description isEqualToString:@"CMKShutterButton"] && [itemCMKBottomBar.class isSubclassOfClass:[UIButton class]]) 
            { 
             UIButton *shutterButton = (UIButton *)itemCMKBottomBar; 

             [shutterButton addTarget:self action:@selector(touchUpInsideCMKShutterButton) forControlEvents:UIControlEventTouchUpInside]; 
            } 
            else 
            { 
             nil; 
            } 
           } 
          } 
          else if ([subviewPLImagePickerCameraView.class.description isEqualToString:@"PLCropOverlay"]) 
          { 
           for (UIView *subviewPLCropOverlay in subviewPLImagePickerCameraView.subviews) 
           { 
            if ([subviewPLCropOverlay.class.description isEqualToString:@"PLCropOverlayBottomBar"]) 
            { 
             for (UIView *subviewPLCropOverlayBottomBar in subviewPLCropOverlay.subviews) 
             { 
              if ([subviewPLCropOverlayBottomBar.class.description isEqualToString:@"PLCropOverlayPreviewBottomBar"]) 
              { 
               for (UIView *itemPLCropOverlayPreviewBottomBar in subviewPLCropOverlayBottomBar.subviews) 
               { 
                if ([itemPLCropOverlayPreviewBottomBar.class isSubclassOfClass:[UIButton class]]) 
                { 
                 UIButton *buttonPLCropOverlay = (UIButton *)itemPLCropOverlayPreviewBottomBar; 

                 if ([buttonPLCropOverlay.titleLabel.text isEqualToString:@"Retake"]) 
                 { 
                  UIButton *retakeButton = buttonPLCropOverlay; 

                  [retakeButton addTarget:self action:@selector(touchUpInsideButtonRetake) forControlEvents:UIControlEventTouchUpInside]; 
                 } 
                 else 
                 { 
                  nil; 
                 } 
                } 
                else 
                { 
                 nil; 
                } 
               } 
              } 
              else 
              { 
               nil; 
              } 
             } 
            } 
            else 
            { 
             nil; 
            } 
           } 
          } 
          else 
          { 
           nil; 
          } 
         } 
        } 
        else 
        { 
         nil; 
        } 
       } 
      } 
      else 
      { 
       nil; 
      } 
     } 
    } 
    else 
    { 
     nil; 
    } 
} 

Und hier ist die Methode, die ich bin Befestigung, die im view-Controller geht, die das Bild Picker-Controller präsentiert:

- (void)touchUpInsideCMKShutterButton 
{ 
    NSLog(@"Take"); 
} 

- (void)touchUpInsideButtonRetake 
{ 
    NSLog(@"Re-take"); 
} 

Hoffe, das hilft jemandem! Vielen Dank.

+0

Hii, @ serge-k Ich habe versucht, Ihren Code, es funktioniert gut in iOS 9.3, aber es funktioniert nicht in iOS 10.2.1 Gerät. – Rivendell

+0

@MahipalSingh danke für das Ausprobieren dieser Lösung. Ich habe ein paar Deadlines für diese Woche, aber ich werde mir diesen Code am Wochenende ansehen können. Ich werde eine aktualisierte Version nach der Untersuchung weiter veröffentlichen. –

+0

@MahipalSingh Versuchen Sie die neu veröffentlichte Lösung. Es funktionierte auf meinem iPhone 5s, das 10.2.1 hat, und versuche es nicht am Simulator, da es keine Kamera hat: P –

1

können Sie die UINavigationControllerDelegate verwenden, die Sie auch implementieren müssen, wenn Sie UIImagePickerController verwenden. die Delegatmethode Umsetzung [...]didShowViewController[...] wie dieses

- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated { 
    NSLog(@"%@", [viewController class]); 
} 

erzeugt die folgende Ausgabe (Verwendung des Simulators, UIImagePickerControllerSourceTypePhotoLibrary als sourceType Auswahl und Navigation wie folgt aus: Fotoalben Übersicht> bestimmtes Album> Bearbeitung spezifischer Foto):

2016.04.08 00: 19: 36,882 ImagePicker [44578: 4.705.834] PUUIAlbumListViewController
2016.04.08 00: 19: 41,341 ImagePicker [44578: 4.705.834] PUUIMomentsGridViewController
2016.04.08 00: 19: 47,929 ImagePicker [ 44578: 4705834] PUUIImageV iiewController

hoffe das hilft!

+0

Dank. aber der 'UIImagePickerController' wird immer noch während der Aufnahme des Fotos dargestellt und auch während der Bearbeitung wird der' - (void) navigationController: (UINavigationController *) navigationController didShowViewController: (UIViewController *) viewController animiert: (BOOL) animierte' Methode wird nur einmal aufgerufen, Das Log-Ergebnis ist 'PLUICameraViewController' –

+0

Sie haben mich in die richtige Richtung gelenkt, indem Sie mich daran erinnert haben, wie der Bilderwähler dargestellt wurde. –

1

UIImagePickerControllerDelegate ist ziemlich schlecht, aber man kann damit umgehen, indem sie ein Beobachter hinzu:

Swift 3:

NotificationCenter.default.addObserver(forName: NSNotification.Name(rawValue: "_UIImagePickerControllerUserDidCaptureItem"), object:nil, queue:nil, using: { note in 
    //Do something 
}) 

Objective-C:

[[NSNotificationCenter defaultCenter] addObserverForName:@"_UIImagePickerControllerUserDidCaptureItem" object:nil queue:nil usingBlock:^(NSNotification * _Nonnull note) { 
    //Do something 
}];