2016-04-15 21 views
5

Görüntü seçici denetleyicisi için tamamen özel kaplama oluşturuyorum. İlk aşama kolay: İlk görüntüyü kayıtla alacağım/takePicture() yöntemini çağıran bir çekim düğmesi alıyorum.Özel fotoğraf seçici yerleşimi üzerinde "fotoğraf kullan" düğmesini gerçekleştirin

Sonraki aşama UI'yi kendi tasarımımla birlikte "Yeniden Kullan" veya "Fotoğrafı Kullan" olarak değiştirir. "Tekrar" muhtemelen presentViewController'u tekrar arayarak taklit edilebilir. "Fotoğrafı kullan" düğmesini nasıl taklit etmeliyim?

+0

Th gerçekleşiyor çünkü TakePhoto() yöntemi çağrıldığında, [self.imagePickerController takePicture] kodu çalışıyor ve didFinishPickingMediaWithInfo çağırıyor? Böylece UI metninizi değiştirme şansınız var, değil mi? – Hasya

+0

Eh. Ben bu soruyla aptal hissediyorum ve lütuf ile başlayan daha aptal. 'TakePicture' ve 'stopVideoCapture' yöntemleri beklediğim gibi çalışmadı. Onlar imagePickerController (_, didFinishPickingMediaWithInfo) 'yi çağırırlar, böylece @ avinash-dadhich'in basit cevabı doğrudur. Benim hatam, bu yöntem çağrısı öncesinde veya böyle bir şeyden önce uygulamanın çökmesiydi. Karışıklık için özür dilerim. – vlastachu

cevap

4

Fotoğrafı, çekilen görüntüyü düzenleme ve kaydetme ve iptal etme düğmesini ekleme seçeneği sunan bir görünüm denetleyicisi sunarak fotoğrafın görünümünü taklit edebilirsiniz. Bu nasıl oluyor?

+0

Kullanıcı "Fotoğrafı kullan" düğmesine basana kadar gerçek görüntü veya videoyu alamıyorum. Bittiğinde, denetleyicim tüm gerekli bilgileri alır. Daha önce bir yere gidebilirim. – vlastachu

8

Kolayca Sonra viewDidLoad geçersiz kılmak ve UIView nesnesi oluşturarak ihtiyaçlarınıza UI özelleştirmek ve self.cameraOverlayView olarak ayarlayın UIImagePickerController

Objective-C

@interface CameraViewController : UIImagePickerController 

@property (readwrite, nonatomic) NSInteger state; // 0 - auto 1 - on 2 - off 

@end 

@implementation CameraViewController 

- (instancetype)init { 
    self = [super init]; 
    if (self) { 
     if (!TARGET_IPHONE_SIMULATOR) { 
      self.sourceType = UIImagePickerControllerSourceTypeCamera; 
      self.showsCameraControls = NO; 
      self.cameraCaptureMode = UIImagePickerControllerCameraCaptureModePhoto; 
     } else { 
      self.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; 
     } 
     self.modalPresentationStyle = UIModalPresentationFullScreen; 
     self.modalTransitionStyle = UIModalTransitionStyleCrossDissolve; 
     self.allowsEditing = NO; 
     self.mediaTypes = @[(NSString *)kUTTypeImage]; 
     [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; 
     [[NSNotificationCenter defaultCenter] addObserver:self 
               selector:@selector(orientationChanged) 
                name:UIDeviceOrientationDidChangeNotification 
                object:nil]; 

    } 
    return self; 
} 

- (void)dealloc { 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
} 

@end 

devralabilir. Örneğimde özel flaş butonu. Kameranın

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    UIView *view = [[UIView alloc] initWithFrame:self.view.bounds]; 
    view.backgroundColor = [UIColor clearColor]; 
    UIButton *changeFlashButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
    changeFlashButton.frame = CGRectMake(70, 27, 40, 40); 
    [changeFlashButton setImage:[UIImage imageNamed:@"flash_auto"] forState:UIControlStateNormal]; 
    self.cameraFlashMode = UIImagePickerControllerCameraFlashModeAuto; 
    changeFlashButton.showsTouchWhenHighlighted = YES; 
    [changeFlashButton addTarget:self action:@selector(changeFlashValue:) forControlEvents:UIControlEventTouchUpInside]; 
    [view addSubview:changeFlashButton]; 
    if (!TARGET_IPHONE_SIMULATOR) { 
     self.cameraFlashMode = UIImagePickerControllerCameraFlashModeAuto; 
     changeFlashButton.alpha = [[self class] isFlashAvailableForCameraDevice:self.cameraDevice]; 
     self.cameraOverlayView = view; 
    } 
} 

- (void)changeFlashValue:(UIButton*)aSwitch { 
    if (self.state == 0) { //auto - on 
     self.state = 1; 
     [self.flashSwitch setImage:[UIImage imageNamed:@"flash_on"] forState:UIControlStateNormal]; 
     self.cameraFlashMode = UIImagePickerControllerCameraFlashModeOn; 
     return; 
    } 
    if (self.state == 1) { //on - off 
     self.state = 2; 
     [self.flashSwitch setImage:[UIImage imageNamed:@"flash_off"] forState:UIControlStateNormal]; 
     self.cameraFlashMode = UIImagePickerControllerCameraFlashModeOff; 
     return; 
    } 
    if (self.state == 2) { //off - auto 
     self.state = 0; 
     [self.flashSwitch setImage:[UIImage imageNamed:@"flash_auto"] forState:UIControlStateNormal]; 
     self.cameraFlashMode = UIImagePickerControllerCameraFlashModeAuto; 
     return; 
    } 
} 

Bu kontrollerde kullanıcıya göstermediği için "tekrar çek" ve sahte

için allowsEditing ayarlamanız gerekir düğmeleri "fotoğraf kullan" bu from left-to-right: flash, take picture, front/rear camera, photo-gallery

ediniz dikkatini gibi olabilir Ve aslında aynısı,Swift 2.2+

class CameraViewController: UIImagePickerController { 

    var state: Int? 

    init() { 
     super.init(navigationBarClass: nil, toolbarClass: nil) 
     #if (arch(i386) || arch(x86_64)) && (os(iOS) || os(watchOS) || os(tvOS)) // any simulator 
      self.sourceType = .PhotoLibrary 
     #else 
      self.sourceType = .Camera 
      self.showsCameraControls = false 
      self.cameraCaptureMode = .Photo 
     #endif 

     self.modalPresentationStyle = .FullScreen 
     self.modalTransitionStyle = .CrossDissolve 
     self.allowsEditing = false 
     self.mediaTypes = [UIImagePickerControllerMediaType] 
     UIDevice.currentDevice().beginGeneratingDeviceOrientationNotifications() 
     NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(orientationChanged), name: UIDeviceOrientationDidChangeNotification, object: nil) 
    } 

    // strange compiler requirements 
    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

    deinit { 
     NSNotificationCenter.defaultCenter().removeObserver(self) 
    } 

    func orientationChanged() { 
     // update to the new orientation 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let view: UIView = UIView(frame: self.view.bounds) 
     view.backgroundColor = UIColor.clearColor() 
     var changeFlashButton: UIButton = UIButton(type: .Custom) 
     changeFlashButton.frame = CGRectMake(70, 27, 40, 40) 
     changeFlashButton.setImage(UIImage(named: "flash_auto"), forState: .Normal) 
     self.cameraFlashMode = .Auto 
     changeFlashButton.showsTouchWhenHighlighted = true 
     changeFlashButton.addTarget(self, action: #selector(changeFlashValue(_:)), forControlEvents: .TouchUpInside) 
     view.addSubview(changeFlashButton) 
     #if (arch(i386) || arch(x86_64)) && (os(iOS) || os(watchOS) || os(tvOS)) // any simulator 
     #else 
      self.cameraFlashMode = .Auto 
      changeFlashButton.alpha = UIImagePickerController.isFlashAvailableForCameraDevice(self.cameraDevice) ? 1 : 0 
     #endif 
    } 

    func changeFlashValue(aSwitch: UIButton) { 
     if self.state == 0 { 
      // auto - on 
      self.state = 1 
      self.flashSwitch.setImage(UIImage.imageNamed("flash_on"), forState: .Normal) 
      self.cameraFlashMode = .On 
      return 
     } 
     if self.state == 1 { 
      // on - off 
      self.state = 2 
      self.flashSwitch.setImage(UIImage.imageNamed("flash_off"), forState: .Normal) 
      self.cameraFlashMode = .Off 
      return 
     } 
     if self.state == 2 { 
      // off - auto 
      self.state = 0 
      self.flashSwitch.setImage(UIImage.imageNamed("flash_auto"), forState: .Normal) 
      self.cameraFlashMode = .Auto 
      return 
     } 
    } 
} 
İlgili konular