दिलचस्प पोस्ट
जाओ और सेट स्क्रीन संकल्प 3 पार्टी जेएस के लिए ब्राउज़र कैशिंग का लाभ उठाएं JTable में एक सेल का पृष्ठभूमि रंग बदलें नेटवर्क ड्राइव पर फ़ाइल पढ़ें प्रोटोटाइप का उपयोग करने के फायदे, कन्स्ट्रक्टर में सीधे तरीकों को परिभाषित करते हैं? वर्ग कोष्ठकों में सामग्री निकालने के लिए जावा नियमित अभिव्यक्ति मैं Laravel 5 में अपवादों / अनुपलब्ध पृष्ठों को कैसे प्राप्त करूं? एंड्रॉइड – JSOUP के साथ पार्स जेएस उत्पन्न यूआरएल जीसीसी एक * ए * ए * ए * ए * ए (ए * ए * ए) * (ए * ए * ए) को क्यों अनुकूलित नहीं करता? PHP_AUTH_USER सेट नहीं है? मेरे ViewPager को एक समय में केवल एक पृष्ठ लोड कैसे कर सकता है अर्थात setOffscreenPageLimit (0); Jquery ट्रिगर फ़ाइल इनपुट क्या रिकर्सिव फ़ंक्शन इनलाइन हो सकती है? जावा क्लास के विकल्प (उदाहरण के लिए इंटरफेस के बजाय) अमूर्त वर्गों के प्रॉक्सी बनाने के लिए प्रोक्सी गतिशील रूप से एसएएस डेटा चरण से मैक्रो को कॉल करें

मैं कैसे पता लगा सकता है कि एक बाहरी कीबोर्ड एक आईपैड पर मौजूद है या नहीं?

क्या पता लगाने का कोई तरीका है कि कोई बाहरी (ब्लूटूथ या यूएसबी) कीबोर्ड iPad से जुड़ा हुआ है?

वेब के समाधान से एकत्रित समाधान "मैं कैसे पता लगा सकता है कि एक बाहरी कीबोर्ड एक आईपैड पर मौजूद है या नहीं?"

एक अप्रत्यक्ष और एसडीके-सुरक्षित तरीके से एक टेक्स्ट फ़ील्ड को पहला प्रत्युत्तर देना है यदि बाह्य कीबोर्ड मौजूद है, तो UIKeyboardWillShowNotification स्थानीय सूचना पोस्ट नहीं की जाएगी।

आप "GSEventHardwareKeyboardAttached" ( kGSEventHardwareKeyboardAvailabilityChangedNotification ) डार्विन अधिसूचना को सुन सकते हैं, लेकिन यह एक निजी एपीआई है, इसलिए यह संभव है कि यदि आप इस का उपयोग करते हैं तो आपका ऐप अस्वीकार कर दिया जाएगा। जांचने के लिए कि बाहरी हार्डवेयर मौजूद है, निजी GSEventIsHardwareKeyboardAttached() फ़ंक्शन का उपयोग करें

UIKit इस बात को सुनता है और इसके अनुसार UIKeyboardImpl.isInHardwareKeyboardMode प्रॉपर्टी को सेट करता है, लेकिन फिर यह निजी एपीआई है।

इसके लिए एक और स्तर है

  • यदि आपके पास कोई इनपुट एसेटरीव्यू नहीं है, तो आपको अधिसूचना नहीं मिलेगी क्योंकि उपरोक्त स्पष्टीकरण बताते हैं।
  • हालांकि, अगर आपने पाठ दृश्य के लिए एक इनपुट एसेटरीव्यू सेट अप किया है, तो फिर भी आप बाहरी कुंजीपटल उपस्थित होने पर एक UIKeyboard सूचना प्राप्त करेंगे – तर्क यह है कि आपको अपने दृश्य को सही स्थान में एनीमेट करना होगा ताकि आपको एनीमेशन की आवश्यकता हो। सूचना में निहित जानकारी

सौभाग्य से, इस घटना में पर्याप्त जानकारी है यह पता लगाने के लिए कि क्या kbd प्रस्तुत किया जाएगा, हालांकि यह अभी भी थोड़ा सा शामिल है।

यदि हम अधिसूचना शब्दकोश की जांच करते हैं तो हम यह जानकारी देखते हैं:

 UIKeyboardFrameBeginUserInfoKey = NSRect: {{0, 1024}, {768, 308}} UIKeyboardFrameEndUserInfoKey = NSRect: {{0, 980}, {768, 308}} 

वह पोर्ट्रेट में था; अगर हम डिवाइस को पोर्ट्रेट्यूप्सइड डाउन में घुमाएंगे तो हम प्राप्त करेंगे:

 UIKeyboardFrameBeginUserInfoKey = NSRect: {{0, -308}, {768, 308}} UIKeyboardFrameEndUserInfoKey = NSRect: {{0, -264}, {768, 308}} 

इसी तरह लैंडस्केप लिफ्ट और लैंडस्केप राइट में हमें अलग-अलग शुरुआत और समाप्ति स्थान मिलते हैं।

हम्म … ये नंबर क्या मतलब है? आप देख सकते हैं कि केबीडी शुरू करने के लिए ऑफस्क्रीन है, लेकिन यह थोड़ा आगे बढ़ता है डिवाइस ओरिएंटेशन के आधार पर चीजों को और भी बदतर बनाने के लिए, केबीडी स्थान अलग-अलग होते हैं।

हालांकि, हम क्या करने जा रहे हैं यह जानने के लिए पर्याप्त जानकारी है:

  1. केबीडी डिवाइस के भौतिक तल पर ऑफसेट से ही एक ही ऊंचाई तक इनपुट एवरेस्सरिव्यू के रूप में चलता है (लेकिन इसके द्वारा अस्पष्ट)
  2. इसलिए पोर्ट्रेट के मामले में यह 1024 से 9 80 तक चलता है – हमारे पास 44 की ऊँचाई के साथ एक इनपुटएवेशरी दृश्य होना चाहिए, जो वास्तव में मामला है।
  3. तो पोर्ट्रेट में अगर अंत y + inputAccessoryView ऊँचाई == स्क्रीन ऊंचाई, तब kbd दिखाई नहीं दे रहा है। आपको अन्य रोटेशन को संभालना है, लेकिन यह विचार है

@ User721239 पर बिल्डिंग यदि हालत निर्धारित करती है कि कीबोर्ड के नीचे स्वयं के फ्रेम के बाहर है। "कनवर्टर" किसी भी ऑरेंजेशन के लिए फ़्रेम को सामान्य बनाता है

 - (void)keyboardWillShow:(NSNotification *)notification { keyboardFrame = [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue]; keyboardFrame = [self.view convertRect:keyboardFrame fromView:nil]; // convert orientation keyboardSize = keyboardFrame.size; //NSLog(@"keyboardFrame.origin.y = %f", keyboardFrame.origin.y); //NSLog(@"keyboardFrame.size.height = %f", keyboardFrame.size.height); BOOL hardwareKeyboardPresent = FALSE;; if ((keyboardFrame.origin.y + keyboardFrame.size.height) > (self.view.frame.size.height+self.navigationController.navigationBar.frame.size.height)) { hardwareKeyboardPresent = TRUE; } //NSLog(@"bottomOfKeyboard = %f", bottomOfKeyboard); //NSLog(@"self.view.frame.size.height = %f", self.view.frame.size.height); 

अपने UITextView इंस्टेंस पर एक इनपुट एसेटरीविज का प्रयोग करके फ्रेम के साथ एक UIView की आवृत्ति पर सेट करें CGRectZero एक हार्डवेयर कीबोर्ड के साथ काम करने वाले कीबोर्ड नोटिफिकेशन की डिलीवरी प्राप्त करने के लिए काम करता है।

यह कोड मैं UIKeyboardWillShowNotification में कुंजीपटल उपयोगकर्ता जानकारी से ऊंचाई प्राप्त करने के लिए उपयोग करता हूं। भौतिक और वर्चुअल कीबोर्ड दोनों के साथ काम करता है

 NSValue* aValue = [userInfo objectForKey:UIKeyboardFrameEndUserInfoKey]; CGRect keyboardRect = [aValue CGRectValue]; CGFloat deviceHeight = [UIScreen mainScreen].bounds.size.height; CGFloat deviceWidth = [UIScreen mainScreen].bounds.size.width; CGFloat newKeyboardHeight; if (interfaceOrientation == UIInterfaceOrientationPortrait) newKeyboardHeight = deviceHeight - keyboardRect.origin.y; else if (interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) newKeyboardHeight = keyboardRect.size.height + keyboardRect.origin.y; else if (interfaceOrientation == UIInterfaceOrientationLandscapeLeft) newKeyboardHeight = deviceWidth - keyboardRect.origin.x; else newKeyboardHeight = keyboardRect.size.width + keyboardRect.origin.x; 

इस थ्रेड के आधार पर, मैंने दो स्थिर विधियों को इकट्ठा किया है कि मैं कुंजीपटल अधिसूचना विधियों से आसानी से कॉल कर सकता हूं ताकि ठीक से रीसाइजिंग दृश्य (आमतौर पर UIScrollViews) को एक कुंजीपटल दिखाई देने पर, प्रकार (सॉफ़्टवेयर बनाम हार्डवेयर) की परवाह किए बिना:

 + (void)keyboardWillShowHide:(NSNotification *)notification inView:(UIView *)view adjustView:(UIView *)viewToAdjust { // How much should we adjust the view's frame by? CGFloat yOffset = [SMKeyboardUtil keyboardOffsetForKeyboardNotification:notification inView:view]; CGRect viewFrame = viewToAdjust.frame; viewFrame.size.height -= yOffset; // Get the animation parameters being used to show the keyboard. We'll use the same animation parameters as we // resize our view. UIViewAnimationCurve animationCurve; NSTimeInterval animationDuration; [notification.userInfo[UIKeyboardAnimationCurveUserInfoKey] getValue:&animationCurve]; [notification.userInfo[UIKeyboardAnimationDurationUserInfoKey] getValue:&animationDuration]; // Resize the view's frame to subtract/add the height of the keyboard (and any inputAccessoryView) [UIView beginAnimations:@"animate resiz view" context:nil]; [UIView setAnimationDuration:animationDuration]; [UIView setAnimationCurve:animationCurve]; [viewToAdjust setFrame:viewFrame]; [UIView commitAnimations]; } + (CGFloat)keyboardOffsetForKeyboardNotification:(NSNotification *)notification inView:(UIView *)view { NSAssert(notification.userInfo[UIKeyboardFrameBeginUserInfoKey], @"Invalid keyboard notification"); // Get the frame of keyboard from the notification CGRect keyboardFrameBeginRaw = [notification.userInfo[UIKeyboardFrameBeginUserInfoKey] CGRectValue]; CGRect keyboardFrameEndRaw = [notification.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue]; // Because the frame we get from the notification is raw screen coordinates, without accounting for device orientation, // we need to convert the frame to be relative to our view. CGRect keyboardFrameBegin = [view convertRect:keyboardFrameBeginRaw fromView:nil]; CGRect keyboardFrameEnd = [view convertRect:keyboardFrameEndRaw fromView:nil]; // We could examine the size of the frame, but this does not account for hardware keyboards. Instead, // we need to need the delta between the start and end positions to determine how much to modify // the size of our view. return keyboardFrameBegin.origin.y - keyboardFrameEnd.origin.y; } 

आप निम्न का उपयोग कर सकते हैं जो कि कुंजीपटल / टूलबार ऊँचाई के लिए ऊंचाई की गणना भी करता है जब हार्डवेयर कीबोर्ड जुड़ा होता है। आपको कीबोर्डवाल्लो नोट की सदस्यता लेने की आवश्यकता होगी:

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

तो इस तरह की सूचना को संभाल लें:

 - (void)keyboardWillShow:(NSNotification *)notification { // Information we want to determine from notification BOOL isHardwareKB = NO; CGFloat keyboardHeight; // Notification info NSDictionary* userInfo = [notification userInfo]; CGRect keyboardFrame = [[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue]; CGRect keyboard = [self.view convertRect:keyboardFrame fromView:self.view.window]; CGFloat height = self.view.frame.size.height; // Determine if hardware keyboard fired this notification if ((keyboard.origin.y + keyboard.size.height) > height) { isHardwareKB = YES; keyboardHeight = height - keyboard.origin.y; // toolbar height } else { isHardwareKB = NO; // As this value can change depending on rotation keyboardHeight = MIN(keyboardFrame.size.width, keyboardFrame.size.height); } // adjust view ui constraints ext ext depending on keyboard height // .... } 

आप KeyboardWillHide अधिसूचना भी संभाल सकते हैं हार्डवेयर और सॉफ़्टवेयर कीबोर्ड दोनों के लिए पहला रीस्पॉन्डर होने पर यह आग होगी।

 - (void)keyboardWillShow:(NSNotification *)notification { // Information we want to determine from notification BOOL isHardwareKB; // this is irrelevant since it is hidden CGFloat keyboardHeight = 0; // height is now 0 // Do any view layout logic here for keyboard height = 0 // ... } 

पर्यवेक्षक को हटाने के लिए भी मत भूलना:

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

चूंकि पिछली उत्तर में अधिकांश तरीकों को आईओएस 8 और 9 के साथ पदावनत किया गया है, इसलिए मैं वास्तविक खिड़की कीबोर्ड को पाने के लिए कीबोर्ड की चौखटे को वर्तमान विंडो से सूचित करता हूं। तो आप केवल जांच कर सकते हैं कि ऊँचाई बदल गई है या नहीं।

 CGRect reportedKeyboardFrameRaw = [[[notification userInfo] valueForKey: UIKeyboardFrameEndUserInfoKey] CGRectValue]; CGRect reportedKeyboardFrame = [self.view.window convertRect: reportedKeyboardFrameRaw fromWindow:nil]; CGRect visibleKeyboardFrame = CGRectIntersection(reportedKeyboardFrame, self.view.window.frame); if (reportedKeyboardFrame.size.height != visibleKeyboardFrame.size.height) { // External keyboard present! } 

निम्न कोड आपको सभी ओरिएंटेशन के लिए कीबोर्ड फ़्रेम प्रदान करता है चाहे आप पूर्ण स्क्रीन दृश्य का उपयोग कर रहे हों या विभाजन दृश्य के विवरण दृश्य का उपयोग कर रहे हों।

 NSDictionary* info = [aNotification userInfo]; CGRect frame = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue]; CGRect keyboardEndFrame = [self.view convertRect:frame fromView:nil]; // The raw frame values are physical device coordinate. CGSize keyboardSize = keyboardEndFrame.size; 

अधिसूचना द्वारा दिये गए कुंजीपटल फ़्रेम हमेशा स्क्रीन के ऊपरी दाएं कोने के रूप में हार्डवेयर के निर्देशांक के मामले में होते हैं, जब आईओएस डिवाइस को सामान्य पोर्ट्रेट मोड में नीचे होम बटन के साथ होता है विधि -केंद्रीय शोध: fromView विंडो निर्देशांक (= हार्डवेयर) से निर्देशांक को स्थानीय दृश्य निर्देशांक में बदलता है।

मैंने पाया कि ब्लूटूथ कीबोर्ड के साथ आपको एक UIKeyboardDidShowNotification पहली बार मिलता है कि स्क्रीन रोटेशन है लेकिन इसके बाद कोई भी नहीं है डॉक किए गए कीबोर्ड को अनॉक / विभाजन और बीटी कीबोर्ड से अलग करने के लिए कठिन बना देता है

यह पता लगाने के लिए कोई प्रत्यक्ष जवाब नहीं है कि कोई बाहरी कीबोर्ड मौजूद है या नहीं, लेकिन मैं स्क्रीन के निचले भाग में कुंजीपटल-संबंधित दृश्य प्रदर्शित करने के लिए आवश्यक वास्तविक ऊंचाई का पता लगाने के लिए ऐसा कर रहा हूं।

 CGRect keyboardFrame = [[[notification userInfo] objectForKey:@"UIKeyboardFrameEndUserInfoKey"] CGRectValue]; CGFloat keyboardRelatedViewsHeight = self.view.window.frame.size.height - keyboardFrame.origin.y; 

@ दार्शनिक का जवाब मेरे लिए काम किया। आईओएस 8 पर समाधान कम जटिल है:

 CGRect keyboardRect = [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue]; CGFloat deviceHeight = [UIScreen mainScreen].bounds.size.height; CGFloat keyboardHeight = deviceHeight - keyboardRect.origin.y; NSLog(@"actualKeyboardHeight = %f", keyboardHeight);