iOS 11 - ความสูงของแป้นพิมพ์กลับมาเป็น 0 ในการแจ้งเตือนแป้นพิมพ์


84

ฉันใช้การแจ้งเตือนแป้นพิมพ์โดยไม่มีปัญหาใด ๆ และได้รับความสูงของแป้นพิมพ์ที่แน่นอน

- (void)keyboardDidShow:(NSNotification *) notification{
    CGSize keyboardSize = [[[notification userInfo] objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;

    NSLog(@"%f",keyboardSize.height);}

แต่ด้วย iOS 11 ขนาดของแป้นพิมพ์คือ 0 เมื่อมีการเรียกการแจ้งเตือน

ปัญหาที่เกิดขึ้นในสถานการณ์นี้คืออะไร? ฉันใช้ xcode 9 Beta 5

คำตอบ:


190

ใช้สิ่งนี้:

CGSize keyboardSize = [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;

สำหรับ Swift คุณสามารถใช้:

let keyboardSize = (notification.userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue.size

1
คุณช่วยชีวิตฉันไว้
Helen Zhukova

1
ขอบคุณไม่เคยคิดอย่างนั้น
Ammar Hadzic

5
การเปลี่ยนจาก UIKeyboardFrameBeginUserInfoKey เป็น UIKeyboardFrameEndUserInfoKey ทำเคล็ดลับขอบคุณ
user2408952

ขอบคุณฉันลงทุนไปครึ่งวัน แต่คิดไม่ออก ขอบคุณที่ช่วยอีกครึ่งวันของฉัน
Manish Nahar

@Akshay เพียงแค่เริ่มเฟรมและเอนด์เฟรมของแป้นพิมพ์ในขอบเขตหน้าจอที่เกี่ยวข้อง
s.zainulabideen

102

แทนที่ UIKeyboardFrameBeginUserInfoKey

ด้วย

UIKeyboardFrameEndUserInfoKey

ด้านล่างนี้มาจาก Apple Docs

UIKeyboardFrameBeginUserInfoKey- คีย์สำหรับอ็อบเจ็กต์ NSValue ที่มี CGRect ที่ระบุเฟรมเริ่มต้นของแป้นพิมพ์ในพิกัดหน้าจอ

UIKeyboardFrameEndUserInfoKey - คีย์สำหรับอ็อบเจ็กต์ NSValue ที่มี CGRect ที่ระบุเฟรมท้ายของแป้นพิมพ์ในพิกัดหน้าจอ


13
Apple จำเป็นต้องอัปเดตโค้ดตัวอย่างเนื่องจากไม่สามารถใช้งานได้บน iOS 11 อีกต่อไปและจากเอกสารของ Apple ซึ่งใช้ UIKeyboardFrameBeginUserInfoKey: developer.apple.com/library/content/documentation/…
wildcat12

แก้ปัญหาของฉัน! ขอบคุณสำหรับคำแนะนำ!
Ernie

ใครช่วยอธิบายให้ฉันฟังได้ไหมว่าฉันอายุ 5 ขวบว่าความแตกต่างระหว่างสองสิ่งนี้คืออะไรและทำไมสิ่งนี้ถึงสร้างความแตกต่างเมื่อต้องทำให้ UIScrollView เลื่อนโดยอัตโนมัติ ฉันจะขอบคุณจริงๆ ขอบคุณ!
Mario

ไม่ทำงานหลังจากแตะไปที่ช่องข้อความด้วย numPad ถ้าหลังจาก numPad ฉันแตะไปที่ช่องข้อความทั่วไปแป้นพิมพ์จะไม่ขึ้นอีกต่อไปและเมื่อมันปิดมุมมองลง
Jack Daniel

7

ลองสิ่งนี้:

แทนที่UIKeyboardFrameBeginUserInfoKeyด้วยUIKeyboardFrameEndUserInfoKey


1
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillChangeFrame:) name:UIKeyboardWillChangeFrameNotification object:nil];วิธี keyboardWillChangeFrame: ไม่ได้ทำงานเพียงครั้งเดียวอาจจะสองครั้งหรือมากกว่านั้นบางทีแป้นพิมพ์บางตัวจะมีแถบเครื่องมือพิเศษอยู่ด้านบนในบางครั้งวิธีนี้จะทำงานหลายครั้งในเวลานี้ดังนั้นคุณควรแทนที่UIKeyboardFrameBeginUserInfoKeyด้วยUIKeyboardFrameEndUserInfoKeyเพื่อรับเฟรมสุดท้ายของ คีย์บอร์ด.
SolinLiu

5

ฉันมีปัญหาคล้ายกันในการใช้ Xcode เวอร์ชัน 9.0 (9A235); แม้ว่าฉันจะใช้ Swift ในวิธี keyboardWillShow ของฉันฉันเขียนสิ่งต่อไปนี้:

if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {

    let heightValue = keyboardSize.height    

    ...
}

น่าแปลกที่ครั้งแรกที่เรียกว่า keyboardWillShow คือ heightValue คือ 216.0 แต่ในระหว่างการเรียกครั้งต่อ ๆ ไปมันกลายเป็น 0! บางทีนี่อาจเป็นข้อผิดพลาด Xcode

ฉันแทนที่ UIKeyboardFrameBeginUserInfoKey ด้วย UIKeyboardFrameEndUserInfoKey และแก้ไขปัญหาให้ฉันแล้ว


1
ฉันสังเกตเห็นสิ่งเดียวกัน ดูเหมือนว่าจะใช้กับครั้งแรกที่แสดงแป้นพิมพ์เท่านั้น แป้นพิมพ์บนตัวควบคุมมุมมองเพิ่มเติมรายงานความสูงเป็น 0 ในครั้งแรกที่แสดงสำหรับตัวควบคุมมุมมองนั้น
jackofallcode

5

ปัญหานี้เกิดขึ้นบน iOS 11

แทนที่

"UIKeyboardFrameBeginUserInfoKey" กับ "UIKeyboardFrameEndUserInfoKey"

ตามที่แสดงด้านล่างจะช่วยแก้ปัญหาได้

รหัสวัตถุประสงค์ -C:

CGSize keyboardSize = [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;

Swift 2.3:

let keyboardSize = (NfnPsgVar.userInfo![UIKeyboardFrameEndUserInfoKey] as? NSValue)?.CGRectValue().size

Swift 3:

let keyboardSize = (notification.userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue.size

3

คำนวณความสูงของแป้นพิมพ์โดยใช้รหัสด้านล่าง

มันใช้งานได้กับอุปกรณ์ทั้งสองที่มีพื้นที่ปลอดภัยและอุปกรณ์ในพื้นที่ที่ไม่ปลอดภัย

รหัส:

@objc func keyboardWillShow(notification: Notification) {
    guard let keyboardFrame = notification.userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue else {
            return
        }    
    let keyboardHeight: CGFloat                    
    if #available(iOS 11.0, *) {
       let window = UIApplication.shared.keyWindow
       let bottomPadding = window?.safeAreaInsets.bottom ?? 0.0
       keyboardHeight = keyboardFrame.cgRectValue.height - bottomPadding
    } else {
       keyboardHeight = keyboardFrame.cgRectValue.height
    }
}

2

แนวทางของคุณพยายามที่จะได้รับความสูงของเฟรมก่อนที่จะแสดงและนั่นคือสาเหตุที่ควรเป็น 0 ซึ่งฉันไม่แน่ใจว่าทำไมถึงไม่ลองครั้งแรก! นี่คือตัวอย่างวิธีรับความสูงของแป้นพิมพ์อย่างถูกต้องใน swift 4.2:

func keyboardWillShow(notification: Notification) {

    guard let userInfo = notification.userInfo else { return }

    guard var keyboardFrame: CGRect = (userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue else { return }

    keyboardFrame = view.convert(keyboardFrame, from: nil)

    let keyboardHeight = keyboardFrame.height
}

สิ่งนี้จะให้คุณสมบัติของกรอบแป้นพิมพ์ได้อย่างถูกต้องก่อนที่แป้นพิมพ์จะปรากฏขึ้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.