ios - يظهر الانحياز إلى أعلى لوحة المفاتيح في مكان خاطئ في دائرة الرقابة الداخلية 9 شريط اختصار وضع فقط



ipad keyboard (1)

يوس 9 يضيف شريط اختصار إلى شريط يوس 8 كيكتيب .

كجزء من هذا التغيير، إذا قمت بتوصيل لوحة مفاتيح بلوتوث لباد، لوحة المفاتيح في شريط اختصار الحد الأدنى وضع فقط (والتي يمكن محاكاة عن طريق الضغط على الأوامر ك في محاكاة).

لدي رمز الذي يحصل على ارتفاع لوحة المفاتيح باستخدام طريقة مشابهة لما يلي:

CGRect keyboardFrame = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
CGFloat keyboardHeight = keyboardFrame.size.height; // = 313

المشكلة هي أنه عند تبديل لوحة المفاتيح بين الحالة الموسعة والحالة المنهارة، يظل الارتفاع كما هو، مما يتسبب في ظهور ملفي في مكانه القديم:

السلوك المرغوب فيه:


(لاحظ كيف يتم إرفاق الرأي الأحمر إلى أعلى لوحة المفاتيح)

السلوك الفعلي:

ما هي الطريقة الصحيحة للحصول على عرض أحمر ليتم إرفاقها إلى أعلى لوحة المفاتيح؟


المشكلة هي أن معظم التعليمات البرمجية هناك ( بما في ذلك أبل) يتجاهل حقيقة أن إكيبواردفراميندوسرينفوكي هو كغريكت وليس كغسيزي .

// ❌ Bad code, do not use
- (void)keyboardWasShown:(NSNotification*)aNotification {
    NSDictionary* info = [aNotification userInfo];
    CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
    CGRect bkgndRect = activeField.superview.frame;
    bkgndRect.size.height += kbSize.height;
    [activeField.superview setFrame:bkgndRect];
    [scrollView setContentOffset:CGPointMake(0.0, activeField.frame.origin.y-kbSize.height) animated:YES];
}

هنا ترى أن يتم استخدام فقط ارتفاع لوحة المفاتيح ( kbSize.height ). أصل المستقيم مهم، ولا ينبغي تجاهله.

عندما تكون لوحة المفاتيح مرئية، هذا هو المستقيم الذي يتم الإبلاغ عنه:

عندما لوحة المفاتيح في شريط اختصار وضع فقط، وهذا هو المستقيم:

لاحظ كيف أن غالبية لوحة المفاتيح هو أوفسكرين، ومع ذلك فإنه لا يزال نفس الارتفاع.

للحصول على السلوك الصحيح، استخدم سغريكتينترسكتيون مع حدود الرأي والإطار لوحة المفاتيح ضمن هذا الرأي:

// ✅ Good code, use
CGRect keyboardScreenEndFrame = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
CGRect keyboardViewEndFrame = [self.view convertRect:keyboardScreenEndFrame fromView:self.view.window];
CGRect keyboardFrame = CGRectIntersection(self.view.bounds, keyboardViewEndFrame);
CGFloat keyboardHeight = keyboardFrame.size.height; // = 55

لهذا السبب نفسه، يجب استخدام UIKeyboardFrameBeginUserInfoKey بدلا من UIKeyboardFrameBeginUserInfoKey .





ios9