Jaka jest wysokość klawiatury ekranowej iPhone'a?

84

Wysokość w pionie i wysokość w poziomie mierzona w punktach.

Erik B.
źródło
2
Tutaj możesz znaleźć cały wymiar iPhone'a: Wymiary iPhone'a
Pfitz
3
Nie używaj ostatniego linku „Wymiary iPhone'a”! Pochodzi z 2011 roku, zanim pojawił się iOS 8 i pozwalał na zmianę wysokości klawiatury ekranowej.
Mike Gledhill
@MikeGledhill wysokość klawiatury ekranowej różni się nawet przed iOS 8.
ReDetection
Powiązane: Jeśli szukasz rzeczywistych wartości wysokości klawiatury (np. Do celów debugowania), zobacz wysokości klawiatury w języku obcym iOS?
Senseful

Odpowiedzi:

211

Użyłem następującego podejścia do określenia ramki klawiatury w iOS 7.1.

W metodzie init mojego kontrolera widoku zarejestrowałem się w UIKeyboardDidShowNotification:

NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
[center addObserver:self selector:@selector(keyboardOnScreen:) name:UIKeyboardDidShowNotification object:nil];

Następnie użyłem następującego kodu w keyboardOnScreen:celu uzyskania dostępu do ramki klawiatury. Ten kod pobiera userInfosłownik z powiadomienia, a następnie uzyskuje dostęp do NSValueskojarzonego z UIKeyboardFrameEndUserInfoKey. Następnie możesz uzyskać dostęp do CGRect i przekonwertować go na współrzędne widoku kontrolera widoku. Stamtąd możesz wykonać dowolne obliczenia na podstawie tej ramki.

-(void)keyboardOnScreen:(NSNotification *)notification 
 {
        NSDictionary *info  = notification.userInfo;
        NSValue      *value = info[UIKeyboardFrameEndUserInfoKey];

        CGRect rawFrame      = [value CGRectValue];
        CGRect keyboardFrame = [self.view convertRect:rawFrame fromView:nil];

        NSLog(@"keyboardFrame: %@", NSStringFromCGRect(keyboardFrame));
 }

Szybki

I równoważna implementacja w Swift:

NotificationCenter.default.addObserver(self, selector: #selector(keyboardDidShow), name: UIResponder.keyboardDidShowNotification, object: nil)


@objc
func keyboardDidShow(notification: Notification) {
    guard let info = notification.userInfo else { return }
    guard let frameInfo = info[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue else { return }
    let keyboardFrame = frameInfo.cgRectValue
    print("keyboardFrame: \(keyboardFrame)")
}
Ken Anderson
źródło
4
Chociaż wydaje się to trochę skomplikowane, jest to z pewnością lepsze niż zakodowanie rozmiaru klawiatury. Poprawna odpowiedź.
n13
2
Zagłosowano na tę odpowiedź i zagłosowano w dół na pytanie. OP zdecydowanie nie wie, o czym mówi. Uważajcie! Ta odpowiedź jest prawidłowa!
superarts.org
2
jedno uzupełnienie dla Landscape: if (SYSTEM_VERSION_LESS_THAN (@ "8.0")) {_keyboardHeight = keyboardFrame.size.width; } else {_keyboardHeight = keyboardFrame.size.height; }
LiangWang
3
Czy można to zrobić bez konieczności wyświetlania klawiatury? W moim przypadku chcę mieć coś za klawiaturą o tej samej wysokości (podobnie jak posłańcy mają rzeczy)
John
@ superarts.org Nie ma potrzeby głosowania przeciw pytaniu; ludzie najprawdopodobniej będą szukać tego, a teraz zobaczą tę odpowiedź ... więc wszystko jest w porządku :)
Ja͢ck
46

Pamiętaj, że w systemie iOS 8 rozmiar klawiatury ekranowej może się różnić. Nie zakładaj, że klawiatura ekranowa zawsze będzie widoczna (o określonej wysokości) lub niewidoczna.

Teraz, z iOS 8, użytkownik może także przesunąć palcem obszar tekstu przewidywania i wyłączać ... i kiedy to zrobić, to skopać danej aplikacji keyboardWillShowzdarzenie ponownie .

To to zerwanie wielu starszych przykładów kodu, które zalecały napisanie keyboardWillShowzdarzenia, które po prostu mierzy bieżącą wysokość klawiatury ekranowej i przesuwanie elementów sterujących w górę lub w dół na stronie o tę (bezwzględną) wartość.

wprowadź opis obrazu tutaj

Innymi słowy, jeśli zobaczysz przykładowy kod, który po prostu mówi, aby dodać keyboardWillShowzdarzenie, zmierzyć wysokość klawiatury, a następnie zmienić wysokość kontrolek o tę wartość, to nie zawsze będzie działać.

W powyższym przykładzie użyłem przykładowego kodu z poniższej witryny, która animuje constantwartość ograniczeń pionowych .

Ćwiczenie autoukładu

W mojej aplikacji dodałem ograniczenie do mojego UITextView, ustawionego u dołu ekranu. Kiedy ekran pojawił się po raz pierwszy, zapisałem tę początkową odległość w pionie.

Następnie za każdym razem, gdy moje keyboardWillShowzdarzenie zostanie uruchomione, dodaję (nową) wysokość klawiatury do tej oryginalnej wartości ograniczenia (więc ograniczenie zmienia wysokość kontrolki).

wprowadź opis obrazu tutaj

Tak. Jest brzydki.

I jestem trochę zirytowany / zaskoczony, że strasznie bolesny układ AutoLayout XCode 6 nie pozwala nam tylko na podłączenie spodów elementów sterujących do dolnej części ekranu lub górnej części klawiatury ekranowej.

Może czegoś mi brakuje.

Poza moim zdrowiem psychicznym.

Mike Gledhill
źródło
w rzeczywistości rozmiar klawiatury zawsze się różni, nawet w starszych wersjach iOS. np. sprawdź pismo odręczne w języku chińskim
ponowne wykrywanie
Ups, nie zdawałem sobie z tego sprawy. Po prostu wydało mi się to dziwne, że tak wiele próbek "keyboardWillShow" zawsze zakładało, że to zdarzenie zostanie wywołane tylko raz, gdy klawiatura pojawi się lub zniknie ... bez funkcji radzenia sobie z pozostawaniem klawiatury na ekranie, ale ze zmianą jej rozmiaru.
Mike Gledhill
1
@MikeGledhill Myślę, że powinieneś użyć "UIKeyboardWillChangeFrameNotification" do zmiany ramki z powodu obrotu lub pokazania (/ ukrycia) paska przewidywania tekstu ...
Abdalrahman Shatou
Właśnie przetestowałem to w mojej aplikacji. UIKeyboardWillChangeFrameNotification zawsze jest wywoływana RÓWNIEŻ JAK zdarzenie keyboardWillShow, za każdym razem, gdy wyświetlam klawiaturę lub włączam lub wyłączam obszar przewidywania tekstu. Więc to tak naprawdę nie pomaga. Chodzi mi o to, że ... użytkownicy muszą być trochę ostrożni z tymi wydarzeniami, to wszystko.
Mike Gledhill
1
Dlaczego nie poświęca się temu dużo więcej uwagi?
rfoo
30

Wysokość klawiatury wynosi 216 punktów dla trybu pionowego i 162 punktów dla trybu poziomego.

Źródło

Erik B.
źródło
135
Jeśli masz zamiar publikować pytania, na które odpowiedziano samodzielnie, udziel przynajmniej przyzwoitych odpowiedzi. Rozmiar klawiatury należy pobrać z obiektu powiadomienia, a nie zakodowaną na stałe wartość pobraną z jakiejś strony internetowej. Zobacz tutaj
jrturton
16
@jrturton Nie chodzi o to, jak znaleźć wysokość programowo. To pytanie jest przydatne nie tylko dla programistów, ale także dla grafików i tym podobnych. Odpowiedź, o którą prosisz, należy do innego pytania. W rzeczywistości jest jeszcze jedno pytanie z tą odpowiedzią: stackoverflow.com/a/7302291/310121
Erik B
48
@ErikB Bądź ostrożny. Rozmiar klawiatury zależy od języka i typu klawiatury.
Gabriel
13
Dla własnego dobra NIGDY nie używaj wartości zakodowanej na stałe! Jako mocny przykład, użytkownik może używać podzielonej (dwuczęściowej) klawiatury, która nie przejmuje się zbytnio wysokością.
Timo
6
Ta odpowiedź jest leniwa i niebezpieczna. Uzyskaj wysokość klawiatury z UIKeyboardDidShowNotification, ponieważ rzeczywista wartość zmienia się między głównymi wersjami iOS. Zobacz odpowiedź Kena poniżej.
Alexander
16

Uwaga do wersji: nie ma to już znaczenia w iOS 9 i 10, ponieważ obsługują one niestandardowe rozmiary klawiatury.

Zależy to od modelu i paska QuickType:

wprowadź opis obrazu tutaj

http://www.idev101.com/code/User_Interface/sizes.html

Philipp Sander
źródło
1
Uwaga do wersji : nie ma to już znaczenia w iOS 9 i 10, ponieważ obsługują one niestandardowe rozmiary klawiatury.
Raptor,
10

Wysokość klawiatury zależy od modelu, paska QuickType, ustawień użytkownika ... Najlepszym podejściem jest obliczenie dynamiczne:

Swift 3.0

    var heightKeyboard : CGFloat?

    override func viewWillAppear(_ animated: Bool) {
            super.viewWillAppear(animated)
            NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardShown(notification:)), name: NSNotification.Name.UIKeyboardDidShow, object: nil)
    }

    func keyboardShown(notification: NSNotification) {
           if let infoKey  = notification.userInfo?[UIKeyboardFrameEndUserInfoKey],
               let rawFrame = (infoKey as AnyObject).cgRectValue {
               let keyboardFrame = view.convert(rawFrame, from: nil)
               self.heightKeyboard = keyboardFrame.size.height
               // Now is stored in your heightKeyboard variable
           }
    }
gwałtownie
źródło
8

Nie mogę znaleźć ostatniej odpowiedzi, więc sprawdzam wszystko na symulatorze. (IOS 11.0)


Urządzenie | Wysokość ekranu | Portret | Krajobraz

iPhone 4s | 480,0 | 216,0 | 162,0

iPhone 5, iPhone 5s, iPhone SE | 568,0 | 216,0 | 162,0

iPhone 6, iPhone 6s, iPhone 7, iPhone 8, iPhone X | 667,0 | 216,0 | 162,0

iPhone 6 plus, iPhone 7 plus, iPhone 8 plus | 736,0 | 226,0 | 162,0

iPad 5.generacji, iPad Air, iPad Air 2, iPad Pro 9.7, iPad Pro 10.5, iPad Pro 12.9 | 1024,0 | 265,0 | 353,0


Dzięki!

Seungyoun Yi
źródło
0

iPhone

Rozmiary klawiatury:

  1. 5S, SE, 5, 5C (320 × 568) keyboardSize = (0.0, 352.0, 320.0, 216.0) keyboardSize = (0.0, 315.0, 320.0, 253.0)

2.6S, 6,7,8: (375 × 667): keyboardSize = (0.0, 407.0, 375.0, 260.

3.6 +, 6S +, 7+, 8+: (414 × 736) keyboardSize = (0.0, 465.0, 414.0, 271.0)

4.XS, X: (375 X 812) keyboardSize = (0.0, 477.0, 375.0, 335.0)

5.XR, XSMAX ((414 x 896) keyboardSize = (0.0, 550.0, 414.0, 346.0)

Jr.iOS_dev_T27
źródło