2010-01-17 12 views
15

मैंने देखा है कि ओएस 3.1 में आपकैमरा ओवरले व्यू - बस पूर्वावलोकन के लिए?

cameraOverlayView 

हालांकि साथ चित्र पिकर के लिए एक ओवरले दृश्य जोड़ सकते हैं, मैं भी पाया है कि इस विधि के माध्यम से एक दृश्य को जोड़ने भी पूरे समय के लिए दृश्य प्रदर्शित करता है कि UIImagePicker प्रदर्शित होता है, जब मैं केवल पूर्वावलोकन चरण के दौरान इसे दिखाना चाहता हूं।

क्या यह पूर्वावलोकन के दौरान केवल ऐसा करने का कोई तरीका है? मैं नहीं चाहता कि यह खुली शटर एनीमेशन के दौरान हो, या स्क्रीन जो पूछती है कि आप छवि का उपयोग करना चाहते हैं या फिर से लेना चाहते हैं।

+2

हे मैक_55! बस आपको अपने अद्यतन उत्तर को स्वीकार/टिप्पणी करने के लिए धीरे-धीरे याद दिलाना चाहता था। –

उत्तर

17

मैं एक तरह से हालांकि यह एक सा आप वांछित परिणाम प्राप्त करने के लिए खोज निकाला है फिर से दृश्य जोड़ने ... इतना मानक नहीं है। :)

विचार UIImagePickerController संरचनाओं में आंतरिक दृश्यों के क्रम को थोड़ा पुनर्व्यवस्थित करना है।

ठीक है, इसलिए हम UIImagePickerController ऑब्जेक्ट बनाते हैं, इसे प्रारंभ करते हैं और इसमें ओवरले व्यू जोड़ते हैं। मैं आपका ध्यान इस ओर लाना चाहूँगा! उदाहरण कोड में UIView ऑब्जेक्ट (UIImageView) बहुत शुरुआत से छिपा हुआ है। याद मत करो। अंत में हम छवि पिकर नियंत्रक को मोडल व्यू कंट्रोलर के रूप में प्रस्तुत करते हैं। यह कोड कहीं आपके applicationDidFinishLaunching:, viewWillAppear: या लॉन्च विधियों के बारे में उपयुक्त होना चाहिए।

UIImagePickerController *anImagePickerController = [UIImagePickerController new]; 
anImagePickerController.delegate = self; 
anImagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera; 

UIImageView *anImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Watermark.png"]]; 
anImageView.frame = CGRectMake(0, 1, anImageView.image.size.width, anImageView.image.size.height); 
anImageView.hidden = YES; 
anImagePickerController.cameraOverlayView = anImageView; 

[viewController presentModalViewController:anImagePickerController animated:NO]; 
[anImagePickerController release]; 

[NSTimer scheduledTimerWithTimeInterval:0.1 
           target:self 
           selector:@selector(timerFireMethod:) 
           userInfo:anImageView 
           repeats:YES]; 
[anImageView release]; 

पहले ओवरले दृश्य (anImageView) एक NSTimer जारी किया गया है बनाया है, anImageView (NSTimeruserInfo संपत्ति) के साथ प्रारंभ और तुरंत निर्धारित है।

- (void)timerFireMethod:(NSTimer*)theTimer { 
    UIView *cameraOverlayView = (UIView *)theTimer.userInfo; 
    UIView *previewView = cameraOverlayView.superview.superview; 

    if (previewView != nil) { 
     [cameraOverlayView removeFromSuperview]; 
     [previewView insertSubview:cameraOverlayView atIndex:1]; 

     cameraOverlayView.hidden = NO; 

     [theTimer invalidate]; 
    } 
} 

पूरे NSTimer बात प्रवाह में जोड़ा जाता है यह सुनिश्चित करें कि पुनर्व्यवस्था काम के आसपास वास्तव में क्या होगा जब UIImagePickerController कि के लिए पूरी तरह तैयार हो जाएगा: यहाँ विधि कॉल है।

यह है। यह काम करता है, यह मानक नहीं है, यह मोटा और तेज़ है। फिर से अनुकूलित करने और इसे 'राइटर' बनाने के लिए स्वतंत्र महसूस करें (ओह कृपया, मेरा उद्देश्य आपको रास्ता दिखाना था)।

+0

मैं टाइमर चलाने के बाद प्रदर्शित करने के लिए दृश्य सेट करने की सोच रहा था, हालांकि मुझे यकीन नहीं था कि कैमरा हमेशा लोड करने के लिए समान समय लेता है - क्या यह इस बात पर निर्भर नहीं करता कि उस समय कितनी मेमोरी उपयोग में है , और यह किस डिवाइस पर चल रहा है? जैसे यह एक 3 जी की तुलना में 3 जीएस पर तेजी से लोड होगा। –

+0

हे मैक_55, मैंने अपना समाधान अनुकूलित किया है - अब यह सही काम करता है (समाधान के आसपास एक काम के रूप में परिपूर्ण काम कर सकते हैं)। :) एचटीएच –

+0

देरी के लिए खेद है। मुझे अभी तक इसका परीक्षण करने के लिए चारों ओर नहीं मिला है, लेकिन मुझे जवाब के रूप में चिह्नित करने में मुझे खुशी है। :) –

-2

जब आप पिकर का निर्माण करते हैं तो पिकर (picker.cameraOverlayView = myView) पर ओवरले जोड़ें।

ओवरले तस्वीर में नहीं होगा। यह सिर्फ एक जैसा है, जैसा कि एक ओवरले व्यू है।

आप एक तस्वीर (takePicture विधि) लेने से पहले ओवरले दृश्य को हटा सकते हैं और में imagePickerController:didFinishPickingMediaWithInfo:

+0

क्षमा करें, यह वह नहीं है जिसे मैं ढूंढ रहा हूं। मैं तस्वीर लेने से पहले केवल ओवरले प्रदर्शित करना चाहता हूं। कैमरा शटर एनिमेटिंग नहीं होने पर, या जब यह आपको पूछता है कि आपको –

+0

ले जाने वाली तस्वीर पसंद है या नहीं, तो आप लेने के पहले ओवरले (picker.cameraOverlayView = nil) को हटाते हैं, तो शटर एनिमेट होने पर ओवरले नहीं होगा। – diederikh

+0

लेकिन मैं इसे पूर्वावलोकन स्क्रीन पर कैसे दिखाऊं? क्या मैं यह मानने में सही हूं कि टेकफोटो पूर्वावलोकन स्क्रीन में जो कुछ भी है उसे कैप्चर करता है? लेकिन मैं पूर्वावलोकन स्क्रीन पर ओवरले प्रदर्शित करना चाहता हूं (फोटो लेने से पहले) * उलझन में * –

6

वास्तव में, मैं एक ही बात करने के लिए कोशिश कर रहा था और मैं इस ब्लॉग पोस्ट के माध्यम से इसे करने का एक बहुत सरल भर में आया था: http://www.alexcurylo.com/blog/2009/06/18/uiimagepickercontroller-in-3-0/

के बाद से UIImagePickerController एक UINavigatorControllerDelegate कॉल कर सकते हैं, विधि नीचे छवि से पहले कहा जाता हो जाता है पिकर प्रदर्शित होता है।

- (void)navigationController:(UINavigationController *)navigationController 
willShowViewController:(UIViewController *)viewController 
animated:(BOOL)animated 
{ 
    if (!viewController) 
    return; 

    UIView* controllerViewHolder = viewController.view; 
    UIView* controllerCameraView = [[controllerViewHolder subviews] objectAtIndex:0]; 
    UIView* controllerPreview = [[controllerCameraView subviews] objectAtIndex:0]; 
    [controllerCameraView insertSubview:self.overlayView aboveSubview:controllerPreview]; 
} 

आशा है कि मदद करता है:

यहाँ महत्वपूर्ण कोड है।

18

मैं सिर्फ सबव्यू झुकाव के बिना एक और संभावना दिखाना चाहता था। कैमरापिकर में बदलावों के लिए सिस्टम नोटिफिकेशन हैं। वे या तो दस्तावेज नहीं हैं (सबव्यू संरचना के रूप में)। तो वे भी बदलाव के अधीन हैं। लेकिन आप उन्हें प्राप्त करते हैं।

आपके पास कोई नाम का उपयोग करते हुए उनके लिए रजिस्टर कर सकते हैं:

[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(notificationReceived:) name: nil object: nil]; 

हम यहाँ कुछ रोचक (selfexplaining) सूचना प्राप्त होती है:

PLCameraControllerPreviewStartedNotification 
PLCameraViewIrisAnimationWillBeginNotification 
PLCameraViewIrisAnimationDidEndNotification 

Recorder_DidStartPreviewing 
Recorder_SourceStarted 
Recorder_WillCapturePhoto 
Recorder_DidCapturePhoto 
Recorder_PhotoStillImageSampleBufferReady 
Recorder_DidStopPreviewing 

_UIImagePickerControllerUserDidCaptureItem // Photo was taken, preview is shown 
_UIImagePickerControllerUserDidRejectItem // Repeat was pressed, camera is shown again 

आप अपने overlayviews छिपा राज्य या कुछ भी गति प्रदान करने के लिए उन्हें इस्तेमाल कर सकते हैं अन्य।

+0

आपको लगता है कि आप इन ऐप का उपयोग करने के लिए अपना ऐप खारिज कर सकते हैं? –

+0

नहीं, ये सिर्फ तार हैं। यह काम करना चाहिए। लेकिन मैंने अभी तक इसका परीक्षण नहीं किया है। – calimarkus

+1

इसका परीक्षण किया गया, और मैं "_UIImagePickerControllerUserDidCaptureItem" अधिसूचना पर लेटकर अपने कैमरे के दृश्य से अलग होने के लिए अपने पूर्वावलोकन को सफलतापूर्वक बदलने में सक्षम था। मैंने नोटिस किया कि न तो PLCameraViewIrisAnimationWillBeginNotification और न ही PLCameraViewIrisAnimationDidEndNotification को निकाल दिया गया था (मैं आईओएस 6 का उपयोग कर रहा हूं), इसलिए मुझे "रिकॉर्डर_विल कैप्चर फोटो" और "पीएलसीएमेरा कंट्रोलर प्रीव्यूस्टार्ट नॉटिफिकेशन" जैसी घटनाओं के आसपास नोटिफिकेशन का उपयोग करके आसपास काम करना पड़ा। – Christian

संबंधित मुद्दे