Klavye hızlı göründüğünde metin alanını taşıma


217

IOS ile programlamak için Swift kullanıyorum ve taşımak için bu kodu kullanıyorum UITextField, ama çalışmıyor. İşlevi keyboardWillShowdoğru çağırıyorum , ancak metin alanı hareket etmiyor. Otomatik düzenleme kullanıyorum.

override func viewDidLoad() {
    super.viewDidLoad()
    NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillShow:"), name:UIKeyboardWillShowNotification, object: nil);
    NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillHide:"), name:UIKeyboardWillHideNotification, object: nil);
}

deinit {
    NSNotificationCenter.defaultCenter().removeObserver(self);
}

func keyboardWillShow(notification: NSNotification) {
    if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue() {
        //let contentInsets = UIEdgeInsets(top: 0, left: 0, bottom: keyboardSize.height, right: 0)

        var frame = self.ChatField.frame
        frame.origin.y = frame.origin.y - keyboardSize.height + 167
        self.chatField.frame = frame
        println("asdasd")
    }
}

2
Proje dosyalarıyla birlikte izlenecek
Dan Beaulieu

Belki deinit ve viewDidLoad dengeli değildir.
Ricardo

Hem Apple'ın dokümanlarına hem de kişisel deneyimlerine dayanmaktadır. İşte TF taşımak için UIScrollView kullanarak benim git repo: github.com/29satnam/MoveTextFieldWhenKeyboardAppearsSwift
Codetard 18:17

Yanıtlar:


315

Mevcut cevaplarda birkaç iyileştirme yapılması gerekiyor.

Öncelikle UIKeyboardWillChangeFrameNotification muhtemelen sadece göstermek / gizlemek değil, aynı zamanda klavye değişiklikleri (dil, 3. taraf klavyeleri kullanma vb.) Ve dönüşler nedeniyle de değişimleri (klavyenin gizleneceğini gösteren aşağıdaki notu not etmelidir) ele aldığından muhtemelen en iyi bildirimdir. donanım klavye bağlantısını desteklemek için de kullanılabilir).

İkinci olarak, animasyonların düzgün bir şekilde bir arada olmasını sağlamak için animasyon parametreleri bildirimden alınabilir.

Muhtemelen bu kodu biraz daha temizlemek için seçenekler vardır, özellikle sözlük kodunu açarken zorlanıyorsanız.

Hızlı 3

class MyViewController: UIViewController {

// This constraint ties an element at zero points from the bottom layout guide
@IBOutlet var keyboardHeightLayoutConstraint: NSLayoutConstraint?

override func viewDidLoad() {
    super.viewDidLoad()
    // Note that SO highlighting makes the new selector syntax (#selector()) look
    // like a comment but it isn't one
    NotificationCenter.default.addObserver(self,
        selector: #selector(self.keyboardNotification(notification:)),
        name: NSNotification.Name.UIKeyboardWillChangeFrame,
        object: nil)
}

deinit {
    NotificationCenter.default.removeObserver(self)
}

@objc func keyboardNotification(notification: NSNotification) {
    if let userInfo = notification.userInfo {
        let endFrame = (userInfo[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue
        let endFrameY = endFrame.origin.y ?? 0
        let duration:TimeInterval = (userInfo[UIKeyboardAnimationDurationUserInfoKey] as? NSNumber)?.doubleValue ?? 0
        let animationCurveRawNSN = userInfo[UIKeyboardAnimationCurveUserInfoKey] as? NSNumber
        let animationCurveRaw = animationCurveRawNSN?.uintValue ?? UIViewAnimationOptions.curveEaseInOut.rawValue
        let animationCurve:UIViewAnimationOptions = UIViewAnimationOptions(rawValue: animationCurveRaw)
        if endFrameY >= UIScreen.main.bounds.size.height {
            self.keyboardHeightLayoutConstraint?.constant = 0.0
        } else {
            self.keyboardHeightLayoutConstraint?.constant = endFrame?.size.height ?? 0.0
        }
        UIView.animate(withDuration: duration,
                                   delay: TimeInterval(0),
                                   options: animationCurve,
                                   animations: { self.view.layoutIfNeeded() },
                                   completion: nil)
    }
}

(@ Gabox'un aşağıdaki harika yorumuna göre, küçülmek yerine klavye animasyonu ekranını hesaba katmak için düzenlendi)

Hızlı 5

class MyViewController: UIViewController {

// This constraint ties an element at zero points from the bottom layout guide
@IBOutlet var keyboardHeightLayoutConstraint: NSLayoutConstraint?

override func viewDidLoad() {
    super.viewDidLoad()
    // Note that SO highlighting makes the new selector syntax (#selector()) look
    // like a comment but it isn't one
    NotificationCenter.default.addObserver(self,
        selector: #selector(self.keyboardNotification(notification:)),
        name: UIResponder.keyboardWillChangeFrameNotification,
        object: nil)
}

deinit {
    NotificationCenter.default.removeObserver(self)
}

@objc func keyboardNotification(notification: NSNotification) {
    if let userInfo = notification.userInfo {
        let endFrame = (userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue
        let endFrameY = endFrame?.origin.y ?? 0
        let duration:TimeInterval = (userInfo[UIResponder.keyboardAnimationDurationUserInfoKey] as? NSNumber)?.doubleValue ?? 0
        let animationCurveRawNSN = userInfo[UIResponder.keyboardAnimationCurveUserInfoKey] as? NSNumber
        let animationCurveRaw = animationCurveRawNSN?.uintValue ?? UIView.AnimationOptions.curveEaseInOut.rawValue
        let animationCurve:UIView.AnimationOptions = UIView.AnimationOptions(rawValue: animationCurveRaw)
        if endFrameY >= UIScreen.main.bounds.size.height {
            self.keyboardHeightLayoutConstraint?.constant = 0.0
        } else {
            self.keyboardHeightLayoutConstraint?.constant = endFrame?.size.height ?? 0.0
        }
        UIView.animate(withDuration: duration,
                                   delay: TimeInterval(0),
                                   options: animationCurve,
                                   animations: { self.view.layoutIfNeeded() },
                                   completion: nil)
    }
}

1
@JosephLord güzel. ama klavye gizlendiğinde bunun işe yaramadığını gördüm çünkü endFrame?.size.heightnil değil. Son kareyi olarak aldım UIKeyboardFrameEndUserInfoKey = "NSRect: {{0, 1024}, {768, 264}}";. İOS 8.3 iPad Simulator, Portrait'de koştu. Xcode 6.1 beta4.
Mart'ta Hlung

8
klavye gizlenmezse, endFrame? .origin.y> = UIScreen.mainScreen (). bounds.size.height {self.keyboardHeightLayoutConstraint? .constant = 0.0} else {self.keyboardHeightLayoutConstraint? .constant = endFrame.size.height}
Gabriel Goncalves

3
keyBoardHeightLayoutConstraint, InterfaceBuilder'da tanımlanmış, görünümün altını, alt düzen kılavuzuna veya görünüm denetleyicisinin ana görünümünün altına taşımak / daraltmak istediğiniz kısıtlamayı sınırlayan bir kısıtlamadır. Sabit başlangıçta sıfıra ayarlanır ve klavye göründüğünde veya boyutu değiştiğinde klavyeye yer açmak için ayarlanır.
Joseph Lord

2
.UIKeyboardWillChangeFrameİOS klavyesi kaybolsa bile bir donanım klavyesi bağlandığında ateşlenmeyeceğini unutmayın . Bu .UIKeyboardWillHidekenar kasasını yakalamak için de gözlemlemeniz gerekir .
jamesk

1
@Sulthan iyi çalışıyor .. Sorun benim keybaord biraz daha yüksek oluyor olmasıdır. bunu çözebilmemizin bir yolu var mı?
Pavlos

128

Otomatik Mizanpaj kullanıyorsanız, Alt Boşluğu Denetim kısıtlamasına ayarladığınızı varsayıyorum . Bu durumda, kısıtlamanın değerini güncellemeniz yeterlidir. Bunu biraz animasyonla nasıl yapacağınız aşağıda açıklanmıştır.

func keyboardWasShown(notification: NSNotification) {
    let info = notification.userInfo!
    let keyboardFrame: CGRect = (info[UIKeyboardFrameEndUserInfoKey] as! NSValue).CGRectValue()

    UIView.animateWithDuration(0.1, animations: { () -> Void in
        self.bottomConstraint.constant = keyboardFrame.size.height + 20
    })
}

Sabit kodlu 20 yalnızca klavyenin üstündeki metin alanını biraz açmak için eklenir. Aksi takdirde, klavyenin üst kenar boşluğu ve metin alanının alt kenar boşluğu dokunur.

Klavye kapatıldığında, kısıtlamanın değerini orijinal değerine sıfırlayın.


1
Bana nasıl tanımladığımı açıklayabilir misiniz? Teşekkürler! Ben her zaman storyboard üzerindeki tüm kontrol
Pedro Manfredi

4
bottomConstraint, kısıtlamaya verdiğim addır. Constrant'ı seçtim, sürükledim ve ona bir IBOutlet oluşturdum ve bu adı verdim. Kısıtlamalar için tıpkı düğmeler ve metin alanları gibi diğer kullanıcı arabirimi öğelerinde olduğu gibi IBOutlet'ler oluşturabilirsiniz.
Isuru

2
Bu cevap animasyonun benim için hemen gerçekleşmesi dışında çok işe yaradı. Kontrol I hareketlendirmek kısıt değişiklikleri yapmak nasıl? nasıl canlandırılacağına dair
Adam Johns

2
@ vinbhai4u UIKeyboardWillShowNotificationBildirim için kayıt olmalısınız . OP'nin sorusundaki koda bakın.
Isuru

8
@AdamJohns Kısıtlama değişikliğini canlandırmak için, sabiti dışındaki sabitini güncelleyin ve animasyon bloğunun içini animateWithDurationarayın self.view.layoutIfNeeded().
Max

110

Basit bir çözüm, görünümü sabit klavye yüksekliği ile yukarı taşımaktır.

override func viewDidLoad() {
   super.viewDidLoad()        
   NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillShow:"), name:UIKeyboardWillShowNotification, object: nil);
   NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillHide:"), name:UIKeyboardWillHideNotification, object: nil);
}

@objc func keyboardWillShow(sender: NSNotification) {
     self.view.frame.origin.y = -150 // Move view 150 points upward 
}

@objc func keyboardWillHide(sender: NSNotification) {
     self.view.frame.origin.y = 0 // Move view to original position  
}

Hızlı 5:

NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(sender:)), name: UIResponder.keyboardWillShowNotification, object: nil);

NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(sender:)), name: UIResponder.keyboardWillHideNotification, object: nil);

4
Bu basit çözümü seviyorum. Ama bir klavye ekledimBir metin alanından fazla hareket ettiğim için boole gösteriliyor. Klavyeyi gösterilirken yalnızca bir kez hareket ettiriyorum. Teşekkürler.
Ken

2
görünümü taşımak yerine metni taşıyın View
ericgu 23:15

1
Bu, kullanıcı giriş dilini değiştirirse görünümün y değerini koruyacaktır.
Jeffrey Neo

self.view değiştirmek yerine ben self.myConstraint değer yaptım, ama işe yarar (kısıtlamanın uygulandığı) görünümü devam ediyor. bu sorunla karşılaşan oldu mu?
Sashi

5
Bunun yerine kullanmanın self.view.frame.origin.y -= 150kullanımını self.view.frame.origin.y = -150ve yerine self.view.frame.origin.y += 150kullanılması self.view.frame.origin.y = 0. Bu, yeni bir alana her dokunulduğunda görünümün 150 hareket etmesini önler.
gunwin

43

Metin alanını düzenlerken görünümünüzü taşımak için bunu deneyin, bunu uyguladım,

Seçenek 1: - ** ** NotificationCenter kullanarak Swift 5.0 ve iPhone X, XR, XS ve XS Max Move'da güncelleme

  • Bu Bildirimi şuraya kaydet: func viewWillAppear(_ animated: Bool)

  • Bu Bildirimin kaydını sil func viewWillDisappear(_ animated: Bool)

Not: - Kayıttan çıkarılmayacaksanız alt sınıftan çağıracak ve çökme nedeni veya başka bir neden olacaktır.

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    NotificationCenter.default.addObserver( self, selector: #selector(keyboardWillShow(notification:)), name:  UIResponder.keyboardWillShowNotification, object: nil )
}
override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillShowNotification, object: nil)
}

@objc func keyboardWillShow( notification: Notification) {
    if let keyboardFrame: NSValue = notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue {
        var newHeight: CGFloat
        let duration:TimeInterval = (notification.userInfo![UIResponder.keyboardAnimationDurationUserInfoKey] as? NSNumber)?.doubleValue ?? 0
        let animationCurveRawNSN = notification.userInfo![UIResponder.keyboardAnimationCurveUserInfoKey] as? NSNumber
        let animationCurveRaw = animationCurveRawNSN?.uintValue ?? UIView.AnimationOptions.curveEaseInOut.rawValue
        let animationCurve:UIView.AnimationOptions = UIView.AnimationOptions(rawValue: animationCurveRaw)
        if #available(iOS 11.0, *) {
            newHeight = keyboardFrame.cgRectValue.height - self.view.safeAreaInsets.bottom
        } else {
            newHeight = keyboardFrame.cgRectValue.height
        }
        let keyboardHeight = newHeight  + 10 // **10 is bottom margin of View**  and **this newHeight will be keyboard height**
        UIView.animate(withDuration: duration,
                       delay: TimeInterval(0),
                       options: animationCurve,
                       animations: {
                        self.view.textViewBottomConstraint.constant = keyboardHeight **//Here you can manage your view constraints for animated show**
                        self.view.layoutIfNeeded() },
                       completion: nil)
    }
}

Seçenek 2: - İşi iyi

func textFieldDidBeginEditing(textField: UITextField) {
        self.animateViewMoving(up: true, moveValue: 100)
}
func textFieldDidEndEditing(textField: UITextField) {
        self.animateViewMoving(up: false, moveValue: 100)
}

func animateViewMoving (up:Bool, moveValue :CGFloat){
    var movementDuration:NSTimeInterval = 0.3
    var movement:CGFloat = ( up ? -moveValue : moveValue)
    UIView.beginAnimations( "animateView", context: nil)
    UIView.setAnimationBeginsFromCurrentState(true)
    UIView.setAnimationDuration(movementDuration )
    self.view.frame = CGRectOffset(self.view.frame, 0,  movement)
    UIView.commitAnimations()
}

Swift'te klavye göründüğünde bu kaynağı bu kaynaktan aldım UITextField yukarı

Swift 4'DE ---

func textFieldDidBeginEditing(_ textField: UITextField) {
        animateViewMoving(up: true, moveValue: 100)
    }

    func textFieldDidEndEditing(_ textField: UITextField) {
        animateViewMoving(up: false, moveValue: 100)
    }
    func animateViewMoving (up:Bool, moveValue :CGFloat){
        let movementDuration:TimeInterval = 0.3
        let movement:CGFloat = ( up ? -moveValue : moveValue)
        UIView.beginAnimations( "animateView", context: nil)
        UIView.setAnimationBeginsFromCurrentState(true)
        UIView.setAnimationDuration(movementDuration ) 
        self.view.frame = self.view.frame.offsetBy(dx: 0, dy: movement)
        UIView.commitAnimations()
    }

1
@ Jogendra.Com, Sıkı çalışmanız için teşekkürler.Ama, iPhone 5,4s ve 6'da en iyi şekilde çalışır.Ancak, iPhone 6plus ve iPad'de (daha yüksek olanlar) nasıl devre dışı bırakabilirim
Thiha Aung

Seçenek 1'i kullanıyorsanız, lütfen bir sınırlama IBOutlet'i eklediğinizden emin olun. Otomatik mizanpaj kullanarak yeniden boyutlandırmak istediğiniz bir kısıtlama oluşturacaksınız ve sonra canlandır işlevinde self.iboutletConstraint.constant olarak başvurduğum bir IBOutlet oluşturmak için onu viewcontroller'a sürükleyip bırakacaksınız. Ayrıca bu, klavyenin gizlenmesi üzerindeki prizi yeniden ayarlamaz, kısıtlamayı orijinal değerine sıfırlayarak ele aldım.
Hammad Tariq

21

Temiz Swift kodunu seviyorum. İşte bir metin görünümünü klavyeyle yukarı / aşağı taşımak için kullanabileceğim en sıkı kod. Şu anda bir iOS8 / 9 Swift 2 üretim uygulamasında çalışıyor.

GÜNCELLEME (Mart 2016): Önceki kodumu olabildiğince sıkılaştırdım. Ayrıca, klavye yüksekliğini ve animasyon parametrelerini sabit kodlayan bir sürü popüler cevap var. Buna gerek yok, bu cevaplardaki sayıların her zaman 6s + iOS9'umda gördüğüm gerçek değerlerle uyuşmadığından bahsetmeye gerek yok (226 klavye yüksekliği, 0.25 süresi ve 7 animasyon eğrisi). Her durumda, bu değerleri doğrudan sistemden almak neredeyse hiçbir ekstra kod değildir. Aşağıya bakınız.

override func viewDidLoad() {
    super.viewDidLoad()

    NSNotificationCenter.defaultCenter().addObserver(self, selector: "animateWithKeyboard:", name: UIKeyboardWillShowNotification, object: nil)
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "animateWithKeyboard:", name: UIKeyboardWillHideNotification, object: nil)
}

func animateWithKeyboard(notification: NSNotification) {

    // Based on both Apple's docs and personal experience, 
    // I assume userInfo and its documented keys are available.
    // If you'd like, you can remove the forced unwrapping and add your own default values.

    let userInfo = notification.userInfo!
    let keyboardHeight = (userInfo[UIKeyboardFrameEndUserInfoKey] as! NSValue).CGRectValue().height
    let duration = userInfo[UIKeyboardAnimationDurationUserInfoKey] as! Double
    let curve = userInfo[UIKeyboardAnimationCurveUserInfoKey] as! UInt
    let moveUp = (notification.name == UIKeyboardWillShowNotification)

    // baseContraint is your Auto Layout constraint that pins the
    // text view to the bottom of the superview.

    baseConstraint.constant = moveUp ? -keyboardHeight : 0

    let options = UIViewAnimationOptions(rawValue: curve << 16)
    UIView.animateWithDuration(duration, delay: 0, options: options,
        animations: {
            self.view.layoutIfNeeded()
        },
        completion: nil
    )

}

NOT: Bu kod en çok yorum / genel durumu kapsar. Bununla birlikte, farklı yönleri ve / veya özel klavyeleri işlemek için daha fazla kod gerekebilir İşte , iOS klavyesi ile çalışma hakkında ayrıntılı bir makale . Her senaryoyu ele almanız gerekiyorsa, bu yardımcı olabilir.


Swift 1.1 gibi görünüyor ve sanırım Swift 1.2'de derlenmeyecek çünkü askuvvet atmalarını kullanıyor . as!işe yarayabilir, ancak bu sayfada başka bir yerde görebileceğiniz gibi, kuvvet atmalarından kaçınırım ve kendimi açmam.
Joseph Lord

Swift 1.2'de derleniyor. Ve koda yeniden bir yorum ekledim: zorla açılma. Şerefe.
scootermg

Hata. Swift 2'yi kastettim.
16'da scootermg

Nasıl bağlandığınıza bağlı olarak, bunun yerine baseConstraintolabilir . baseConstraint.constant = moveUp ? keyboardHeight : 0baseConstraint.constant = moveUp ? -keyboardHeight : 0
limfinity

15

Düzenleme : Daha kolay ve daha temiz bir çözüm öneriyorum. Alt aralık kısıtlama sınıfını KeyboardLayoutConstraint olarak değiştirin . Klavye yüksekliğine otomatik olarak genişler.


Bu @JosephLord'un cevabının geliştirilmiş bir versiyonudur.

İOS 8.3 iPad Simulator, Portrait'de test edildiği gibi. Xcode6.3 beta4, çünkü klavye gizleme olduğunda onun cevabı çalışma yapmaz bulundu UIKeyboardFrameEndUserInfoKeydeğildir "NSRect: {{0, 1024}, {768, 264}}";. Yükseklik asla 0.

Bu geleneksel kullanımı gider UIKeyboardWillShowNotificationve UIKeyboardWillHideNotificationklavye uç çerçevenin yüksekliği güvenmek yerine saklandığını daha iyi anlatmak için. UIKeyboardWillShowNotificationklavye çerçevesi değiştiğinde de gönderilir, böylece tüm kullanım durumlarını kapsamalıdır.

    // You have to set this up in storyboard first!. 
    // It's a vertical spacing constraint between view and bottom of superview.
    @IBOutlet weak var bottomSpacingConstraint: NSLayoutConstraint! 

    override func viewDidLoad() {
        super.viewDidLoad()

        NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardNotification:"), name:UIKeyboardWillShowNotification, object: nil);
        NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardNotification:"), name:UIKeyboardWillHideNotification, object: nil);
    }

    deinit {
        NSNotificationCenter.defaultCenter().removeObserver(self)
    }

    func keyboardNotification(notification: NSNotification) {

        let isShowing = notification.name == UIKeyboardWillShowNotification

        if let userInfo = notification.userInfo {
            let endFrame = (userInfo[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.CGRectValue()
            let endFrameHeight = endFrame?.size.height ?? 0.0
            let duration:NSTimeInterval = (userInfo[UIKeyboardAnimationDurationUserInfoKey] as? NSNumber)?.doubleValue ?? 0
            let animationCurveRawNSN = userInfo[UIKeyboardAnimationCurveUserInfoKey] as? NSNumber
            let animationCurveRaw = animationCurveRawNSN?.unsignedLongValue ?? UIViewAnimationOptions.CurveEaseInOut.rawValue
            let animationCurve:UIViewAnimationOptions = UIViewAnimationOptions(rawValue: animationCurveRaw)
            self.bottomSpacingConstraint?.constant = isShowing ? endFrameHeight : 0.0
            UIView.animateWithDuration(duration,
                delay: NSTimeInterval(0),
                options: animationCurve,
                animations: { self.view.layoutIfNeeded() },
                completion: nil)
        }
    }

Düzenlemenizi açıklar mısınız? Çalışamadım. Altta bir düğme ile bir UIScrollView var. Sınıfı alt kenar boşluğunun alt sınırına yerleştirdim.
schw4ndi

@ schw4ndi alt sınırlarınız hangi görünümlere bağlıdır? kaydırma görüntüsünün alt kısmını o kaydırma görüntüsünün denetiminin altına bağlamalıdır.
Hlung

Oh teşekkürler, ben düğme ve scrollView arasındaki kısıtlama vardı
schw4ndi

9

swift 4 ile çalışıyorum ve herhangi bir ekstra alt kısıtlama kullanmadan bu sorunu çözdüm kodum burada.its gerçekten benim durumum üzerinde çalışıyor

1) Yüklü bildirim gözlemcisi ekle

override func viewDidLoad() {
        super.viewDidLoad()
        setupManager()
        // Do any additional setup after loading the view.
        NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillShow), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillHide), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
    }

2) Bildirim Gözlemcisini aşağıdaki gibi kaldırın

deinit {
        NotificationCenter.default.removeObserver(self)
    }

3) Klavye gösterisi ekle / gibi yöntemleri gizle

 @objc func keyboardWillShow(notification: NSNotification) {
            if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
                UIView.animate(withDuration: 0.1, animations: { () -> Void in
                    self.view.frame.origin.y -= keyboardSize.height
                    self.view.layoutIfNeeded()
                })
            }
        }

@objc func keyboardWillHide(notification: NSNotification) {
        if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
            UIView.animate(withDuration: 0.1, animations: { () -> Void in
                self.view.frame.origin.y += keyboardSize.height
                self.view.layoutIfNeeded()
            })
        }
    }

4) Textfeild delegesi ekleyin ve dokunuşlar ekleyinElektronik yöntemler.

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        view.endEditing(true)

    }

olması gerekiyorUIKeyboardFrameEndUserInfoKey
Micro

1
NSNotification.Name.UIKeyboardWillShow olarak UIResponder.keyboardWillShowNotificationda UIKeyboardFrameBeginUserInfoKey değiştirildiUIResponder.keyboardFrameBeginUserInfoKey
smj

7

Bu @JosephLord ve @ Hlung'un cevabının geliştirilmiş bir versiyonudur. Sekme çubuğunuz olsun veya olmasın uygulanabilir. Ve klavyeyle orijinal konumuna taşınan görünümü mükemmel bir şekilde geri yükler.

// You have to set this up in storyboard first!. 
// It's a vertical spacing constraint between view and bottom of superview.
@IBOutlet weak var bottomSpacingConstraint: NSLayoutConstraint! 

override func viewDidLoad() {
        super.viewDidLoad()            

        //    Receive(Get) Notification
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardNotification:", name: UIKeyboardWillShowNotification, object: nil)
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardNotification:", name: UIKeyboardWillHideNotification, object: nil)


        self.originalConstraint = self.keyboardHeightLayoutConstraint?.constant //for original coordinate.
}

func keyboardNotification(notification: NSNotification) {
        let isShowing = notification.name == UIKeyboardWillShowNotification

        var tabbarHeight: CGFloat = 0
        if self.tabBarController? != nil {
            tabbarHeight = self.tabBarController!.tabBar.frame.height
        }
        if let userInfo = notification.userInfo {
            let endFrame = (userInfo[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.CGRectValue()
            let duration:NSTimeInterval = (userInfo[UIKeyboardAnimationDurationUserInfoKey] as? NSNumber)?.doubleValue ?? 0
            let animationCurveRawNSN = userInfo[UIKeyboardAnimationCurveUserInfoKey] as? NSNumber
            let animationCurveRaw = animationCurveRawNSN?.unsignedLongValue ?? UIViewAnimationOptions.CurveEaseInOut.rawValue
            let animationCurve:UIViewAnimationOptions = UIViewAnimationOptions(rawValue: animationCurveRaw)
            self.keyboardHeightLayoutConstraint?.constant = isShowing ? (endFrame!.size.height - tabbarHeight) : self.originalConstraint!
            UIView.animateWithDuration(duration,
                delay: NSTimeInterval(0),
                options: animationCurve,
                animations: { self.view.layoutIfNeeded() },
                completion: nil)
        }
}

6

Herhangi bir kod gerektirmeyen en kolay yol:

  1. Zaten Spring animasyon çerçevesini kullanmıyorsanız, KeyboardLayoutConstraint.swift dosyasını indirin ve dosyayı projenize ekleyin (sürükleyip bırakın).
  2. Film şeridinizde nesne / görünüm / metin alanı için bir alt sınır oluşturun, kısıtlamayı seçin (çift tıklayın) ve Kimlik Denetçisinde sınıfını NSLayoutConstraint yerine KeyboardLayoutConstraint olarak değiştirin.
  3. Bitti!

Nesne, senkronize olarak klavyeyle otomatik olarak yukarı taşınır.


2
Harika bir çözüm! Ancak Güvenli Alan'a ihtiyacınız var. Kısıtlamadaki ilk öğe olarak alt (ikinci öğe olduğunda benim için çalışmadı). Ve en iyi, sabit alanı koruduğu ve ayarladığı için, alanı ve klavyeyi gösterecek kadar hareket ettirmek yerine 0'a ayarlanmış sabit ile çalıştı.
Mythlandia

KeyboardLayoutConstraint swift4 sürümünüz var mı?
jeet.chanchawat

6

Klavye görünümünü / kaybolmasını ele almak için bir Swift 3 protokolü oluşturdum

import UIKit

protocol KeyboardHandler: class {

var bottomConstraint: NSLayoutConstraint! { get set }

    func keyboardWillShow(_ notification: Notification)
    func keyboardWillHide(_ notification: Notification)
    func startObservingKeyboardChanges()
    func stopObservingKeyboardChanges()
}


extension KeyboardHandler where Self: UIViewController {

    func startObservingKeyboardChanges() {

        // NotificationCenter observers
        NotificationCenter.default.addObserver(forName: NSNotification.Name.UIKeyboardWillShow, object: nil, queue: nil) { [weak self] notification in
          self?.keyboardWillShow(notification)
        }

        // Deal with rotations
        NotificationCenter.default.addObserver(forName: NSNotification.Name.UIKeyboardWillChangeFrame, object: nil, queue: nil) { [weak self] notification in
          self?.keyboardWillShow(notification)
        }

        // Deal with keyboard change (emoji, numerical, etc.)
        NotificationCenter.default.addObserver(forName: NSNotification.Name.UITextInputCurrentInputModeDidChange, object: nil, queue: nil) { [weak self] notification in
          self?.keyboardWillShow(notification)
        }

        NotificationCenter.default.addObserver(forName: NSNotification.Name.UIKeyboardWillHide, object: nil, queue: nil) { [weak self] notification in
          self?.keyboardWillHide(notification)
        }
    }


    func keyboardWillShow(_ notification: Notification) {

      let verticalPadding: CGFloat = 20 // Padding between the bottom of the view and the top of the keyboard

      guard let value = notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue else { return }
      let keyboardHeight = value.cgRectValue.height

      // Here you could have more complex rules, like checking if the textField currently selected is actually covered by the keyboard, but that's out of this scope.
      self.bottomConstraint.constant = keyboardHeight + verticalPadding

      UIView.animate(withDuration: 0.1, animations: { () -> Void in
          self.view.layoutIfNeeded()
      })
  }


  func keyboardWillHide(_ notification: Notification) {
      self.bottomConstraint.constant = 0

      UIView.animate(withDuration: 0.1, animations: { () -> Void in
          self.view.layoutIfNeeded()
      })
  }


  func stopObservingKeyboardChanges() {
      NotificationCenter.default.removeObserver(self)
  }

}

Ardından, bir UIViewController içinde uygulamak için aşağıdakileri yapın:

  • viewController'ın şu protokole uymasına izin verin:

    class FormMailVC: UIViewControlle, KeyboardHandler {
  • view'da klavye değişikliklerini gözlemlemeye başlayın

    // MARK: - View controller life cycle
    override func viewWillAppear(_ animated: Bool) {
      super.viewWillAppear(animated)
      startObservingKeyboardChanges()
    }
  • görünümdeki klavye değişikliklerini gözlemlemeyi durdurun

    override func viewWillDisappear(_ animated: Bool) {
      super.viewWillDisappear(animated)
      stopObservingKeyboardChanges()
    }
  • film şeridindeki alt kısıtlama için bir IBOutlet oluşturun:

    // NSLayoutConstraints
    @IBOutlet weak var bottomConstraint: NSLayoutConstraint!

    (Tüm kullanıcı arayüzünüzün bir "contentView" içine gömülmesini ve bu özelliğe bu contentView ile alt düzen kılavuzunun alt sınırını bağlamanızı öneririz) İçerik görüntüleme alt kısıtlaması

  • üst sınırlamanın kısıtlama önceliğini 250 (düşük) olarak değiştir

İçerik görüntüleme üst sınırlaması

Bu, klavye göründüğünde tüm içeriğin yukarı doğru kaymasını sağlamak içindir. Öncelik, içerik sarılma öncelikleri / içerik sıkıştırma direnci öncelikleri dahil olmak üzere alt görünümlerdeki diğer kısıtlama önceliklerinden daha düşük olmalıdır.

  • Otomatik Düzenlemenizin contentView öğesinin nasıl yukarı kaydırılması gerektiğini belirlemek için yeterli kısıtlamaya sahip olduğundan emin olun.

Bunun için "eşitten büyük" bir kısıtlama eklemeniz gerekebilir: "eşitten büyük" kısıtlaması

İşte başlıyoruz! Klavye olmadan

Klavye ile


Uyarılar olmadan "İlişki = Eşit" i de koyarsanız işe yarar.
Valtoni Boaventura

Eşit bir ilişki koyarsanız, yalnızca belirli durumlarda işe yarayabilir. Diğerlerinde otomatik mizanpaj tutarsızlığı uyarısı alabilirsiniz. Bu kendi düzeninize bağlıdır. Bu yüzden "mecbur olabilirsin" dedim.
Frédéric Adda

Tamam Frédéric, kabul etti. Güzel bir çözümdü!
Valtoni Boaventura

eksikimport UIKit
Mirko

6

Böyle basit bir UIViewController uzatma kullanılabilir

//MARK: - Observers
extension UIViewController {

    func addObserverForNotification(notificationName: String, actionBlock: (NSNotification) -> Void) {
        NSNotificationCenter.defaultCenter().addObserverForName(notificationName, object: nil, queue: NSOperationQueue.mainQueue(), usingBlock: actionBlock)
    }

    func removeObserver(observer: AnyObject, notificationName: String) {
        NSNotificationCenter.defaultCenter().removeObserver(observer, name: notificationName, object: nil)
    }
}

//MARK: - Keyboard observers
extension UIViewController {

    typealias KeyboardHeightClosure = (CGFloat) -> ()

    func addKeyboardChangeFrameObserver(willShow willShowClosure: KeyboardHeightClosure?,
        willHide willHideClosure: KeyboardHeightClosure?) {
            NSNotificationCenter.defaultCenter().addObserverForName(UIKeyboardWillChangeFrameNotification,
                object: nil, queue: NSOperationQueue.mainQueue(), usingBlock: { [weak self](notification) in
                    if let userInfo = notification.userInfo,
                        let frame = (userInfo[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.CGRectValue(),
                        let duration = userInfo[UIKeyboardAnimationDurationUserInfoKey] as? Double,
                        let c = userInfo[UIKeyboardAnimationCurveUserInfoKey] as? UInt,
                        let kFrame = self?.view.convertRect(frame, fromView: nil),
                        let kBounds = self?.view.bounds {

                            let animationType = UIViewAnimationOptions(rawValue: c)
                            let kHeight = kFrame.size.height
                            UIView.animateWithDuration(duration, delay: 0, options: animationType, animations: {
                                if CGRectIntersectsRect(kBounds, kFrame) { // keyboard will be shown
                                    willShowClosure?(kHeight)
                                } else { // keyboard will be hidden
                                    willHideClosure?(kHeight)
                                }
                                }, completion: nil)
                    } else {
                            print("Invalid conditions for UIKeyboardWillChangeFrameNotification")
                    }
            })
    }

    func removeKeyboardObserver() {
        removeObserver(self, notificationName: UIKeyboardWillChangeFrameNotification)
    }
}

Kullanım örneği

override func viewWillDisappear(animated: Bool) {
        super.viewWillDisappear(animated)

        removeKeyboardObserver()
    }

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)

    addKeyboardChangeFrameObserver(willShow: { [weak self](height) in
        //Update constraints here
        self?.view.setNeedsUpdateConstraints()
        }, willHide: { [weak self](height) in
        //Reset constraints here
        self?.view.setNeedsUpdateConstraints()
    })
}

Swift 4 çözümü

//MARK: - Observers
extension UIViewController {

  func addObserverForNotification(_ notificationName: Notification.Name, actionBlock: @escaping (Notification) -> Void) {
    NotificationCenter.default.addObserver(forName: notificationName, object: nil, queue: OperationQueue.main, using: actionBlock)
  }

  func removeObserver(_ observer: AnyObject, notificationName: Notification.Name) {
    NotificationCenter.default.removeObserver(observer, name: notificationName, object: nil)
  }
}

//MARK: - Keyboard handling
extension UIViewController {

  typealias KeyboardHeightClosure = (CGFloat) -> ()

  func addKeyboardChangeFrameObserver(willShow willShowClosure: KeyboardHeightClosure?,
                                      willHide willHideClosure: KeyboardHeightClosure?) {
    NotificationCenter.default.addObserver(forName: NSNotification.Name.UIKeyboardWillChangeFrame,
                                           object: nil, queue: OperationQueue.main, using: { [weak self](notification) in
                                            if let userInfo = notification.userInfo,
                                              let frame = (userInfo[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue,
                                              let duration = userInfo[UIKeyboardAnimationDurationUserInfoKey] as? Double,
                                              let c = userInfo[UIKeyboardAnimationCurveUserInfoKey] as? UInt,
                                              let kFrame = self?.view.convert(frame, from: nil),
                                              let kBounds = self?.view.bounds {

                                              let animationType = UIViewAnimationOptions(rawValue: c)
                                              let kHeight = kFrame.size.height
                                              UIView.animate(withDuration: duration, delay: 0, options: animationType, animations: {
                                                if kBounds.intersects(kFrame) { // keyboard will be shown
                                                  willShowClosure?(kHeight)
                                                } else { // keyboard will be hidden
                                                  willHideClosure?(kHeight)
                                                }
                                              }, completion: nil)
                                            } else {
                                              print("Invalid conditions for UIKeyboardWillChangeFrameNotification")
                                            }
    })
  }

  func removeKeyboardObserver() {
    removeObserver(self, notificationName: NSNotification.Name.UIKeyboardWillChangeFrame)
  }
}

Hızlı 4.2

//MARK: - Keyboard handling
extension UIViewController {

    func addObserverForNotification(_ notificationName: Notification.Name, actionBlock: @escaping (Notification) -> Void) {
        NotificationCenter.default.addObserver(forName: notificationName, object: nil, queue: OperationQueue.main, using: actionBlock)
    }

    func removeObserver(_ observer: AnyObject, notificationName: Notification.Name) {
        NotificationCenter.default.removeObserver(observer, name: notificationName, object: nil)
    }

    typealias KeyboardHeightClosure = (CGFloat) -> ()

    func removeKeyboardObserver() {
        removeObserver(self, notificationName: UIResponder.keyboardWillChangeFrameNotification)
    }

    func addKeyboardChangeFrameObserver(willShow willShowClosure: KeyboardHeightClosure?,
                                        willHide willHideClosure: KeyboardHeightClosure?) {
        NotificationCenter.default.addObserver(forName: UIResponder.keyboardWillChangeFrameNotification,
                                               object: nil, queue: OperationQueue.main, using: { [weak self](notification) in
                                                if let userInfo = notification.userInfo,
                                                    let frame = (userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue,
                                                    let duration = userInfo[UIResponder.keyboardAnimationDurationUserInfoKey] as? Double,
                                                    let c = userInfo[UIResponder.keyboardAnimationCurveUserInfoKey] as? UInt,
                                                    let kFrame = self?.view.convert(frame, from: nil),
                                                    let kBounds = self?.view.bounds {

                                                    let animationType = UIView.AnimationOptions(rawValue: c)
                                                    let kHeight = kFrame.size.height
                                                    UIView.animate(withDuration: duration, delay: 0, options: animationType, animations: {
                                                        if kBounds.intersects(kFrame) { // keyboard will be shown
                                                            willShowClosure?(kHeight)
                                                        } else { // keyboard will be hidden
                                                            willHideClosure?(kHeight)
                                                        }
                                                    }, completion: nil)
                                                } else {
                                                    print("Invalid conditions for UIKeyboardWillChangeFrameNotification")
                                                }
        })
    }
}

2
diğer çözümlerden çok daha fazla "Swift" / her şey yeniden yazılmadan her denetleyicide harika / yeniden kullanılabilir -> kesinlikle en iyisi burada :)
Tib

Denedim ama şansım yok, UIScrollView gerekli mi veya ne?
erdemgc

@erdemgc Kullanım örneği gördünüz mü? Tek ihtiyacınız olan sadece UIViewControlller + addKeyboardChangeFrameObserver ve sonra kaldırmayı unutmayın
ale_stro

Buradaki removeKeyboardObserver()yöntem aslında gözlemciyi kaldırmaz. Bunu çağırmazsanız Invalid conditions for UIKeyboardWillChangeFrameNotification, add yönteminde konsolda bir görürsünüz . Bunu çağırırsanız, aynı hatayı görürsünüz, yani gözlemci kaldırılmaz. Belgelerde "Gözlemlerin kaydını silmek için bu yöntemle döndürülen nesneyi iletirsiniz removeObserver(_:)." Bunun yerine, bu yöntemle döndürülen nesneyi kaydetmek, ardından gözlemciyi kaldırmak istediğinizde onu aktarmaktır.
Huy-Anh Hoang

Aslında, kaydırma görünümü yüklendikten sonra sınır değerine atanır ve klavye çerçevesi sınırla kesişirse klavyenin gizlenip gizlenmeyeceğini algılayamazsınız.
James Kim

5

Bu kütüphaneyi ve appDidFinishedLaunching içinde sadece bir satır kod kullanabilirsiniz ve u yapılır ..

func application(application: UIApplication,didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    IQKeyboardManager.sharedManager().enable = true
    return true
}

IQKeyboardManager - klavye her göründüğünde görünümü ayarla bağlantısı - https://github.com/hackiftekhar/IQKeyboardManager


4
struct MoveKeyboard {
    static let KEYBOARD_ANIMATION_DURATION : CGFloat = 0.3
    static let MINIMUM_SCROLL_FRACTION : CGFloat = 0.2;
    static let MAXIMUM_SCROLL_FRACTION : CGFloat = 0.8;
    static let PORTRAIT_KEYBOARD_HEIGHT : CGFloat = 216;
    static let LANDSCAPE_KEYBOARD_HEIGHT : CGFloat = 162;
}


  func textFieldDidBeginEditing(textField: UITextField) {
    let textFieldRect : CGRect = self.view.window!.convertRect(textField.bounds, fromView: textField)
    let viewRect : CGRect = self.view.window!.convertRect(self.view.bounds, fromView: self.view)

    let midline : CGFloat = textFieldRect.origin.y + 0.5 * textFieldRect.size.height
    let numerator : CGFloat = midline - viewRect.origin.y - MoveKeyboard.MINIMUM_SCROLL_FRACTION * viewRect.size.height
    let denominator : CGFloat = (MoveKeyboard.MAXIMUM_SCROLL_FRACTION - MoveKeyboard.MINIMUM_SCROLL_FRACTION) * viewRect.size.height
    var heightFraction : CGFloat = numerator / denominator

    if heightFraction < 0.0 {
        heightFraction = 0.0
    } else if heightFraction > 1.0 {
        heightFraction = 1.0
    }

    let orientation : UIInterfaceOrientation = UIApplication.sharedApplication().statusBarOrientation
    if (orientation == UIInterfaceOrientation.Portrait || orientation == UIInterfaceOrientation.PortraitUpsideDown) {
        animateDistance = floor(MoveKeyboard.PORTRAIT_KEYBOARD_HEIGHT * heightFraction)
    } else {
        animateDistance = floor(MoveKeyboard.LANDSCAPE_KEYBOARD_HEIGHT * heightFraction)
    }

    var viewFrame : CGRect = self.view.frame
    viewFrame.origin.y -= animateDistance

    UIView.beginAnimations(nil, context: nil)
    UIView.setAnimationBeginsFromCurrentState(true)
    UIView.setAnimationDuration(NSTimeInterval(MoveKeyboard.KEYBOARD_ANIMATION_DURATION))

    self.view.frame = viewFrame

    UIView.commitAnimations()
}


func textFieldDidEndEditing(textField: UITextField) {
    var viewFrame : CGRect = self.view.frame
    viewFrame.origin.y += animateDistance

    UIView.beginAnimations(nil, context: nil)
    UIView.setAnimationBeginsFromCurrentState(true)

    UIView.setAnimationDuration(NSTimeInterval(MoveKeyboard.KEYBOARD_ANIMATION_DURATION))

    self.view.frame = viewFrame

    UIView.commitAnimations()

}

Son olarak delege yöntemlerini kullandığımız için

func textFieldShouldReturn(textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        return true
    }

objektif-c kullanmaktan yeniden düzenlenmiş http://www.cocoawithlove.com/2008/10/sliding-uitextfields-around-to-avoid.html


Bu çözüm benim için çalıştı, ancak bazı ek işler yapmak zorunda kaldım: bir var animateDistance: CGFloat!artı bildirmek kullanıcı gizlemek klavye düğmesine bastığında için UIKeyboardWillHideNotification işlemek zorunda kaldı.
Rhuantavan

4

Otomatik düzenlemeye, kısıtlamalara veya herhangi bir prize bağlı olmayan başka bir çözüm. İhtiyacınız olan şey, bir kaydırma görünümündeki alanlarınız.

override func viewDidLoad() {
    super.viewDidLoad()

    NSNotificationCenter.defaultCenter().addObserver(self, selector: "makeSpaceForKeyboard:", name: UIKeyboardWillShowNotification, object: nil)
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "makeSpaceForKeyboard:", name: UIKeyboardWillHideNotification, object: nil)
}

func makeSpaceForKeyboard(notification: NSNotification) {
    let info = notification.userInfo!
    let keyboardHeight:CGFloat = (info[UIKeyboardFrameEndUserInfoKey] as! NSValue).CGRectValue().size.height
    let duration:Double = info[UIKeyboardAnimationDurationUserInfoKey] as! Double

    if notification.name == UIKeyboardWillShowNotification {
        UIView.animateWithDuration(duration, animations: { () -> Void in
            var frame = self.view.frame
            frame.size.height = frame.size.height - keyboardHeight
            self.view.frame = frame
        })
    } else {
        UIView.animateWithDuration(duration, animations: { () -> Void in
            var frame = self.view.frame
            frame.size.height = frame.size.height + keyboardHeight
            self.view.frame = frame
        })
    }

}

1
Arandıktan sonra siyah ekran gösteriyor UIKeyboardWillShowNotification.
Sachin Kumaram

4

İşte Swift 2.2 için bir çözüm sürümüm:

Bildirimleri Göster / Gizle için ilk kayıt

NSNotificationCenter.defaultCenter().addObserver(self,
                                                 selector: #selector(MessageThreadVC.keyboardWillShow(_:)),
                                                 name: UIKeyboardWillShowNotification,
                                                 object: nil)
NSNotificationCenter.defaultCenter().addObserver(self,
                                                 selector: #selector(MessageThreadVC.keyboardWillHide(_:)),
                                                 name: UIKeyboardWillHideNotification,
                                                 object: nil)

Ardından bu bildirimlere karşılık gelen yöntemlerde ana görünümü yukarı veya aşağı taşıyın

func keyboardWillShow(sender: NSNotification) {
if let keyboardSize = (sender.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.CGRectValue() {
  self.view.frame.origin.y = -keyboardSize.height
  }
}

func keyboardWillHide(sender: NSNotification) {
self.view.frame.origin.y = 0
}

Hile, "QuickType Öneri Çubuğu" her genişletildiğinde veya daraltıldığında çağrı alan "keyboardWillShow" bölümünde. Ardından, ana görünümün toplam klavye yüksekliğinin negatif değerine eşit olan ("QuickType çubuğu" bölümü olsun veya olmasın) y koordinatını ayarladık.

Sonunda gözlemcileri kaldırmayı unutma

deinit {
NSNotificationCenter.defaultCenter().removeObserver(self)
}

3

Aşağıdakiler, metin alanının alt düzen kılavuzuna bağlayan bir kısıtlaması olduğu basit bir çözümdür. Kısıtlamanın sabitine klavye yüksekliğini ekler.

// This constraint ties the text field to the bottom layout guide
@IBOutlet var textFieldToBottomLayoutGuideConstraint: NSLayoutConstraint!

override func viewDidLoad() {
    super.viewDidLoad()

    NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillShow:", name:UIKeyboardWillShowNotification, object: nil);
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillHide:", name:UIKeyboardWillHideNotification, object: nil);
}

func keyboardWillShow(sender: NSNotification) {
    if let keyboardSize = (sender.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue() {
        self.textFieldToBottomLayoutGuideConstraint?.constant += keyboardSize.height
    }
}

func keyboardWillHide(sender: NSNotification) {
    if let keyboardSize = (sender.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue() {
        self.textFieldToBottomLayoutGuideConstraint?.constant -= keyboardSize.height
    }
}

3

Sanırım çok geç olabilirim ama Saqib'ın cevabının başka bir basit versiyonunu buldum. Autolayout'u kısıtlamalarla kullanıyorum. Kullanıcı adı ve şifre alanlarıyla başka bir ana görünümün içinde küçük bir görünüm var. Görünüşün y koordinatını değiştirmek yerine, bir değişkene orijinal kısıtlama değerini kaydediyorum ve kısıtlamanın sabitini bir değere değiştiriyorum ve klavye çıktıktan sonra, kısıtlamayı orijinal olana ayarlıyorum. Bu şekilde Saqib'in cevabının sahip olduğu problemi önler (Görünüm yukarı hareket etmeye devam eder ve durmaz). Kodum aşağıda ...

override func viewDidLoad() {
    super.viewDidLoad()
    NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillShow:"), name:UIKeyboardWillShowNotification, object: nil);
    NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillHide:"), name:UIKeyboardWillHideNotification, object: nil);
    self.originalConstraint = self.centerYConstraint.constant
  }

  func keyboardWillShow(sender: NSNotification) {
    self.centerYConstraint.constant += 30
  }

  func keyboardWillHide(sender: NSNotification) {
    self.centerYConstraint.constant = self.originalConstraint
  }

KeyboardWillShow yöntemi içinde self.centerYConstraint.constant == self.originalCenterYConstraint'in bu koşul arasında bir kod satırı olup olmadığını kontrol edin . OriginalCenterYContraint, viewdidload'da sakladığım centerYContraint'in orijinal değeridir. Bu benim için çalıştı.
Sashi

3

Swift 4.x cevabı, @Joseph Lord ve @Isuru'dan gelen cevapları birleştirerek. bottomConstrainttaşımak istediğiniz görünümün alt kısıtlamasını temsil eder.

override func viewDidLoad() {
    // Call super
    super.viewDidLoad()

    // Subscribe to keyboard notifications
    NotificationCenter.default.addObserver(self,
                                           selector: #selector(keyboardNotification(notification:)),
                                           name: UIResponder.keyboardWillChangeFrameNotification,
                                           object: nil)        
}


deinit {
    NotificationCenter.default.removeObserver(self)
}


@objc func keyboardNotification(notification: NSNotification) {
    if let userInfo = notification.userInfo {
        // Get keyboard frame
        let keyboardFrame = (userInfo[UIResponder.keyboardFrameEndUserInfoKey] as! NSValue).cgRectValue

        // Set new bottom constraint constant
        let bottomConstraintConstant = keyboardFrame.origin.y >= UIScreen.main.bounds.size.height ? 0.0 : keyboardFrame.size.height

        // Set animation properties
        let duration = (userInfo[UIResponder.keyboardAnimationDurationUserInfoKey] as? NSNumber)?.doubleValue ?? 0
        let animationCurveRawNSN = userInfo[UIResponder.keyboardAnimationCurveUserInfoKey] as? NSNumber
        let animationCurveRaw = animationCurveRawNSN?.uintValue ?? UIView.AnimationOptions.curveEaseInOut.rawValue
        let animationCurve = UIView.AnimationOptions(rawValue: animationCurveRaw)

        // Animate the view you care about
        UIView.animate(withDuration: duration, delay: 0, options: animationCurve, animations: {
            self.bottomConstraint.constant = bottomConstraintConstant
            self.view.layoutIfNeeded()
        }, completion: nil)
    }
}

2

Aşağıdaki şekilde yaptım:

Bu, metin alanı denetimi görüntülendiğinde yararlıdır

class AdminLoginViewController: UIViewController,
UITextFieldDelegate{

    @IBOutlet weak var txtUserName: UITextField!
    @IBOutlet weak var txtUserPassword: UITextField!
    @IBOutlet weak var btnAdminLogin: UIButton!

    private var activeField : UIView?

    var param:String!
    var adminUser : Admin? = nil
    var kbHeight: CGFloat!

    override func viewDidLoad()
    {
        self.addKeyBoardObserver()
        self.addGestureForHideKeyBoard()
    }

    override func viewWillDisappear(animated: Bool) {
        super.viewWillDisappear(animated)
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    func addGestureForHideKeyBoard()
    {
        let tapGesture = UITapGestureRecognizer(target: self, action: Selector("hideKeyboard"))
        tapGesture.cancelsTouchesInView = false
        view.addGestureRecognizer(tapGesture)
    }

    func hideKeyboard() {
        self.view.endEditing(true)
    }

    func addKeyBoardObserver(){

        NSNotificationCenter.defaultCenter().addObserver(self, selector: "willChangeKeyboardFrame:",
name:UIKeyboardWillShowNotification, object: nil)
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "willChangeKeyboardFrame:",
name:UIKeyboardWillHideNotification, object: nil)
    }

    func removeObserver(){
        NSNotificationCenter.defaultCenter().removeObserver(self)
    }

    //MARK:- textfiled Delegate

    func textFieldShouldBeginEditing(textField: UITextField) -> Bool
    {
         activeField = textField

        return true
    }
    func textFieldShouldEndEditing(textField: UITextField) -> Bool
    {
        if activeField == textField
        {
            activeField = nil
        }

        return true
    }

    func textFieldShouldReturn(textField: UITextField) -> Bool {

        if txtUserName == textField
        {
            txtUserPassword.becomeFirstResponder()
        }
        else if (textField == txtUserPassword)
        {
            self.btnAdminLoginAction(nil)
        }
        return true;
    }

    func willChangeKeyboardFrame(aNotification : NSNotification)
    {
       if self.activeField != nil && self.activeField!.isFirstResponder()
    {
        if let keyboardSize =  (aNotification.userInfo![UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue()
        {
            let dy = (self.activeField?.superview?.convertRect((self.activeField?.frame)!, toView: view).origin.y)!

            let height = (self.view.frame.size.height - keyboardSize.size.height)

            if dy > height
            {
                var frame = self.view.frame

                frame.origin.y = -((dy - height) + (self.activeField?.frame.size.height)! + 20)

                self.view.frame = frame
            }
        }
    }
    else
    {
        var frame = self.view.frame
        frame.origin.y = 0
        self.view.frame = frame
    }
    } }

2
    func registerForKeyboardNotifications(){
        //Keyboard
        NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(keyboardWasShown), name: UIKeyboardDidShowNotification, object: nil)
        NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(keyboardWillBeHidden), name: UIKeyboardDidHideNotification, object: nil)


    }
    func deregisterFromKeyboardNotifications(){

        NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillShowNotification, object: nil)
        NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillHideNotification, object: nil)

    }
    func keyboardWasShown(notification: NSNotification){

        let userInfo: NSDictionary = notification.userInfo!
        let keyboardInfoFrame = userInfo.objectForKey(UIKeyboardFrameEndUserInfoKey)?.CGRectValue()

        let windowFrame:CGRect = (UIApplication.sharedApplication().keyWindow!.convertRect(self.view.frame, fromView:self.view))

        let keyboardFrame = CGRectIntersection(windowFrame, keyboardInfoFrame!)

        let coveredFrame = UIApplication.sharedApplication().keyWindow!.convertRect(keyboardFrame, toView:self.view)

        let contentInsets = UIEdgeInsetsMake(0, 0, (coveredFrame.size.height), 0.0)
        self.scrollViewInAddCase .contentInset = contentInsets;
        self.scrollViewInAddCase.scrollIndicatorInsets = contentInsets;
        self.scrollViewInAddCase.contentSize = CGSizeMake((self.scrollViewInAddCase.contentSize.width), (self.scrollViewInAddCase.contentSize.height))

    }
    /**
     this method will fire when keyboard was hidden

     - parameter notification: contains keyboard details
     */
    func keyboardWillBeHidden (notification: NSNotification) {

        self.scrollViewInAddCase.contentInset = UIEdgeInsetsZero
        self.scrollViewInAddCase.scrollIndicatorInsets = UIEdgeInsetsZero

    }

1
Hızlı 2.2'de metin alanını klavyenin üzerine taşımak için yukarıdaki kodu kullanın. Umarım bazılarına yardımcı olur.
Kamalkumar.E

1

Aşağıdaki şekilde yaptım:

class SignInController: UIViewController , UITextFieldDelegate {

@IBOutlet weak var scrollView: UIScrollView!

// outlet declartion
@IBOutlet weak var signInTextView: UITextField!

var kbHeight: CGFloat!

/**
*
* @method viewDidLoad
*
*/

override func viewDidLoad() {
    super.viewDidLoad()

    self.signInTextView.delegate = self

}// end viewDidLoad

/**
*
* @method viewWillAppear
*
*/

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)

    NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillShow:"), name: UIKeyboardWillShowNotification, object: nil)

    NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillHide:"), name: UIKeyboardWillHideNotification, object: nil)

}// end viewWillAppear

/**
*
* @method viewDidAppear
*
*/

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)


}// end viewDidAppear

/**
*
* @method viewWillDisappear
*
*/
override func viewWillDisappear(animated: Bool) {
    super.viewWillDisappear(animated)
    NSNotificationCenter.defaultCenter().removeObserver(self)
}

/**
*
* @method textFieldShouldReturn
* retun the keyboard value
*
*/

// MARK -
func textFieldShouldReturn(textField: UITextField) -> Bool {
    signInTextView.resignFirstResponder()
    return true;

}// end textFieldShouldReturn

// MARK - keyboardWillShow
func keyboardWillShow(notification: NSNotification) {
    if let userInfo = notification.userInfo {
        if let keyboardSize =  (userInfo[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue() {
            kbHeight = keyboardSize.height
            self.animateTextField(true)
        }
    }
}// end keyboardWillShow

// MARK - keyboardWillHide
func keyboardWillHide(notification: NSNotification) {
    self.animateTextField(false)
}// end keyboardWillHide

// MARK - animateTextField
func animateTextField(up: Bool) {
    var movement = (up ? -kbHeight : kbHeight)

    UIView.animateWithDuration(0.3, animations: {
        self.view.frame = CGRectOffset(self.view.frame, 0, movement)
    })
}// end animateTextField

/**
*
* @method didReceiveMemoryWarning
*
*/

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.

}// end didReceiveMemoryWarning


}// end SignInController

1

Yukarıdaki çözümleri deneyen ve hala probleminiz çözülmemiş benim gibi iseniz, sizin için cazibe gibi çalışan harika bir çözümüm var. Öncelikle yukarıda bahsedilen çözümlerle ilgili birkaç şeyi açıklığa kavuşturmak istiyorum.

  1. Benim durumumda IQkeyboardmanager yalnızca öğelere otomatik düzen uygulanmadığında çalışıyordu, eğer uygulanırsa IQkeyboard yöneticisi düşündüğümüz gibi çalışmaz.
  2. Kendini yukarı doğru hareket ettirmekle aynı şey .
  3. Ben kullanıcı tıkladığında UITexfield yukarı doğru itmek için hızlı bir destek ile objektif bir c başlık wriiten var, UITextfield kapsayan klavye sorunu çözme: https://github.com/coolvasanth/smart_keyboard .
  4. İOS uygulama geliştirmede orta veya daha yüksek bir seviyeye sahip olan kişi, depoyu kolayca anlayabilir ve uygulayabilir. Herşey gönlünce olsun

1

İşte tüm TextField Adımları için genel bir çözüm -

1) Diğer ViewControllers tarafından genişletilen ortak bir ViewController oluşturun

override func viewDidLoad() {
    super.viewDidLoad()
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil)

}
 @objc func keyboardWillShow(notification: NSNotification) {
    if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
        if self.view.frame.origin.y == 0 {
            self.view.frame.origin.y -= getMoveableDistance(keyboarHeight: keyboardSize.height)
        }
    }
}

@objc func keyboardWillHide(notification: NSNotification) {
    if self.view.frame.origin.y != 0 {
        self.view.frame.origin.y = 0
    }
}
deinit {
    NotificationCenter.default.removeObserver(self)
}

//get the distance to move up the main view for the focus textfiled
func getMoveableDistance(keyboarHeight : CGFloat) ->  CGFloat{
    var y:CGFloat = 0.0
    if let activeTF = getSelectedTextField(){
        var tfMaxY = activeTF.frame.maxY
        var containerView = activeTF.superview!
        while containerView.frame.maxY != self.view.frame.maxY{
            let contViewFrm = containerView.convert(activeTF.frame, to: containerView.superview)
            tfMaxY = tfMaxY + contViewFrm.minY
            containerView = containerView.superview!
        }
        let keyboardMinY = self.view.frame.height - keyboarHeight
        if tfMaxY > keyboardMinY{
            y = (tfMaxY - keyboardMinY) + 10.0
        }
    }

    return y
}

2) UIViewController ve şu anda etkin olan TextField'in bir uzantısını oluşturun

//get active text field

uzatma UIViewController {func getSelectedTextField () -> UITextField? {

    let totalTextFields = getTextFieldsInView(view: self.view)

    for textField in totalTextFields{
        if textField.isFirstResponder{
            return textField
        }
    }

    return nil

}

func getTextFieldsInView(view: UIView) -> [UITextField] {

    var totalTextFields = [UITextField]()

    for subview in view.subviews as [UIView] {
        if let textField = subview as? UITextField {
            totalTextFields += [textField]
        } else {
            totalTextFields += getTextFieldsInView(view: subview)
        }
    }

    return totalTextFields
}

}


Nedense, keyboardWillShow işlevinde bir sorun yaşıyordum, ilk boyut geçişinden sonra keyboardSize yanlış boyut alıyordu (ilk geçişin doğru çerçevesi var). Bunu userInfo = bildirim.userInfo else {return} guard let keyboardSize = userInfo [UIResponder.keyboardFrameEndUserInfoKey] olarak korumak için değiştirerek bu düzeltildi? NSValue else {return} let keyboardFrame = keyboardSize.cgRectValue eğer self.view.frame.origin.y == 0 {self.view.frame.origin.y - = getMoveableDistance (keyboarHeight: keyboardFrame.height)}. Birisi aynı sorunu varsa :)
Youstanzr

1

Çok Basit ve daha fazla kodlamaya gerek yok. pod 'IQKeyboardManagerSwift'Pod dosyalarınızı ekleyin ve sayfanıza aşağıya AppDelegatekod ekleyin.

import IQKeyboardManagerSwift

ve yöntem didFinishLaunchingWithOptions()türünde

IQKeyboardManager.shared.enable = true

bu kadar. daha iyi anlamak için bu video bağlantısını kontrol edin https://youtu.be/eOM94K1ZWN8 Umarım bu size yardımcı olacaktır.


TextView için çalışıyor mu ve "Bitti" dönüş tuşu için başlığı nasıl değiştirebilirim?
tdt kien

Git: - "IQKeyboardManager.m" Bu satırı değiştirin (Satır No. 968): - [textField addDoneOnKeyboardWithTarget: self action: @selector (doneAction :) shouldShowPlaceholder: _shouldShowTextFieldPlaceholder] bununla: - [textField addRightButtonOextKeyt: self action: @selector (doneAction :) shouldShowPlaceholder: _shouldShowTextFieldPlaceholder]; Ve henüz metin görünümü için denemedim, umarım bu size yardımcı olacaktır.
Raghib Arshi

1

Klavyeyi yönetmek için tam kod.

        override func viewWillAppear(_ animated: Bool) {
            NotificationCenter.default.addObserver(self, selector: #selector(StoryMediaVC.keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)
            NotificationCenter.default.addObserver(self, selector: #selector(StoryMediaVC.keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil)
        }
        override func viewWillDisappear(_ animated: Bool) {
            NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillShowNotification, object: nil)
            NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillHideNotification, object: nil)
        }
        @objc func keyboardWillShow(notification: NSNotification) {
            guard let userInfo = notification.userInfo else {return}
            guard let keyboardSize = userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue else {return}
            let keyboardFrame = keyboardSize.cgRectValue

            if self.view.bounds.origin.y == 0{
                self.view.bounds.origin.y += keyboardFrame.height
            }
        }


        @objc func keyboardWillHide(notification: NSNotification) {
            if self.view.bounds.origin.y != 0 {
                self.view.bounds.origin.y = 0
            }
        }

0

@Simpa çözümünü biraz değiştirdim .........

override func viewDidLoad() 
{

    super.viewDidLoad()
    NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("makeSpaceForKeyboard:"), name:UIKeyboardWillShowNotification, object: nil);
    NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("makeSpaceForKeyboard:"), name:UIKeyboardWillHideNotification, object: nil);
}

deinit{
    NSNotificationCenter.defaultCenter().removeObserver(self)
}

var keyboardIsVisible = false
override func makeSpaceForKeyboard(notification: NSNotification) {

    let info = notification.userInfo!
    let keyboardHeight:CGFloat = (info[UIKeyboardFrameEndUserInfoKey] as! NSValue).CGRectValue().size.height
    let duration:Double = info[UIKeyboardAnimationDurationUserInfoKey] as! Double

    if notification.name == UIKeyboardWillShowNotification && keyboardIsVisible == false{

        keyboardIsVisible = true

        UIView.animateWithDuration(duration, animations: { () -> Void in
            var frame = self.view.frame
            frame.size.height = frame.size.height - keyboardHeight
            self.view.frame = frame
        })

    } else if keyboardIsVisible == true && notification.name == UIKeyboardWillShowNotification{

    }else {
        keyboardIsVisible = false

        UIView.animateWithDuration(duration, animations: { () -> Void in
            var frame = self.view.frame
            frame.size.height = frame.size.height + keyboardHeight
            self.view.frame = frame
        })
    }
}

0

Hiçbiri işe yaramadı ve klavye görüntülendiğinde görünümümü yukarı taşımak için içerik eklerini kullandım.

Not: UITableView kullanıyordum

Tamamen objektif C'de yazılan referanslı çözüm @ keyboard-content-offset , aşağıdaki çözüm temiz Swift.

Bildirim gözlemcisini ekleyin @ viewDidLoad ()

NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(yourClass.keyboardWillBeShown), name:UIKeyboardWillShowNotification, object: nil);
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(yourClass.keyboardWillBeHidden), name:UIKeyboardWillHideNotification, object: nil);

Klavye boyutunu elde etmek için, öncelikle alıcının kullanabileceği ek nesneleri depolayan bildirim nesnesinden userInfo sözlüğünü alırız.

Bu sözlükten UIKeyboardFrameBeginUserInfoKey tuşunu kullanarak klavyenin çerçevesini açıklayan CGRect nesnesini alabiliriz.

Tablo görünümü @ keyboardWillBeShown yöntemi için içerik metnini uygulayın,

func keyboardWillBeShown(sender: NSNotification)
{        
    // Move the table view

    if let keyboardSize = (sender.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.CGRectValue()
    {
        let contentInsets = UIEdgeInsetsMake(0.0, 0.0, (keyboardSize.height), 0.0);

        yourTableView.contentInset = contentInsets;

        yourTableView.scrollIndicatorInsets = contentInsets;
    }
}

Görünümü @ keyboardWillBeHidden yöntemini geri yükleme

func keyboardWillBeHidden(sender: NSNotification)
{
    // Moving back the table view back to the default position

    yourTableView.contentInset = UIEdgeInsetsZero;

    yourTableView.scrollIndicatorInsets = UIEdgeInsetsZero;
}

Cihaz yönünü de dikkate almak istiyorsanız, kodu ihtiyaçlarınıza göre uyarlamak için koşullu ifadeler kullanın.

// Portrait
UIEdgeInsetsMake(0.0, 0.0, (keyboardSize.height), 0.0);

// Landscape
UIEdgeInsetsMake(0.0, 0.0, (keyboardSize.width), 0.0);

0
override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    NotificationCenter.default.addObserver(self, selector: #selector(ViewController.keyboardWillShow), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(ViewController.keyboardWillHide), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
}

func keyboardWillShow(_ notification:Notification) {
    if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
        tableView.contentInset = UIEdgeInsetsMake(0, 0, keyboardSize.height, 0)
    }
}

func keyboardWillHide(_ notification:Notification) {
    if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
        tableView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0)
    }
}

resim açıklamasını buraya girin


0

Kullandığım Swift 4 çözümü klavye boyutunu alıyor. Önem verdiğiniz serverStatusStackViewherhangi bir görünümle değiştirin , örneğin self.view::

deinit {
    NotificationCenter.default.removeObserver(self)
}

@objc func keyboardWillShow(notification: NSNotification) {
    if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
        serverStatusStackView.frame.origin.y = keyboardSize.height * 2 - serverStatusStackView.frame.height
    }
}

@objc func keyboardWillHide(notification: NSNotification) {
    if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
        serverStatusStackView.frame.origin.y += keyboardSize.height
    }
}

override func viewDidLoad() {
    super.viewDidLoad()
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(notification:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil)

    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(notification:)), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
}

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.