J'utilise Swift pour programmer avec iOS et j'utilise ce code pour déplacer le UITextField
, mais cela ne fonctionne pas. J'appelle la fonction keyboardWillShow
correctement, mais le champ de texte ne bouge pas. J'utilise la mise en page automatique.
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")
}
}
ios
swift
cocoa-touch
keyboard
uitextfield
Pedro Manfredi
la source
la source
Réponses:
Il y a quelques améliorations à apporter aux réponses existantes.
Premièrement, l' UIKeyboardWillChangeFrameNotification est probablement la meilleure notification car elle gère les modifications qui ne sont pas seulement affichées / masquées mais les modifications dues aux changements de clavier (langue, utilisation de claviers tiers, etc.) et les rotations aussi (mais notez le commentaire ci-dessous indiquant que le clavier se cachera devrait également pris en charge pour prendre en charge la connexion matérielle du clavier).
Deuxièmement, les paramètres d'animation peuvent être extraits de la notification pour s'assurer que les animations sont correctement regroupées.
Il existe probablement des options pour nettoyer un peu plus ce code, surtout si vous êtes à l'aise avec le déballage forcé du code du dictionnaire.
Swift 3
(Modifié pour tenir compte de l'animation du clavier hors écran au lieu de rétrécir, selon le commentaire impressionnant de @ Gabox ci-dessous)
Swift 5
la source
endFrame?.size.height
n'est pas nul. J'ai le cadre de fin commeUIKeyboardFrameEndUserInfoKey = "NSRect: {{0, 1024}, {768, 264}}";
. Exécuté sur iOS 8.3 iPad Simulator, Portrait. Xcode6.3 beta4..UIKeyboardWillChangeFrame
cela ne se déclenche pas lorsqu'un clavier matériel est connecté, même si le clavier iOS disparaît. Vous devez également observer.UIKeyboardWillHide
pour attraper ce cas de bord.Si vous utilisez la mise en page automatique, je suppose que vous avez défini la contrainte Espace inférieur sur Superview . Si c'est le cas, il vous suffit de mettre à jour la valeur de la contrainte. Voici comment vous le faites avec un peu d'animation.
Le 20 codé en dur est ajouté uniquement pour faire apparaître un peu le champ de texte au-dessus du clavier. Sinon, la marge supérieure du clavier et la marge inférieure du champ de texte se toucheraient.
Lorsque le clavier est fermé, réinitialisez la valeur de la contrainte à sa valeur d'origine.
la source
UIKeyboardWillShowNotification
notification. Regardez le code dans la question du PO.animateWithDuration
et appelezself.view.layoutIfNeeded()
à l'intérieur du bloc d'animation.Une solution simple consiste à déplacer la vue vers le haut avec une hauteur de clavier constante.
Swift 5:
la source
self.view.frame.origin.y -= 150
utilisationself.view.frame.origin.y = -150
et au lieu de l'self.view.frame.origin.y += 150
utilisationself.view.frame.origin.y = 0
. Cela empêche la vue de bouger de 150 chaque fois qu'un nouveau champ est touché.Pour déplacer votre vue lors de la modification du champ de texte, essayez ceci, je l'ai appliqué,
Option 1: - ** ** Mise à jour dans Swift 5.0 et iPhone X, XR, XS et XS Max Move à l'aide de NotificationCenter
Enregistrez cette notification dans
func viewWillAppear(_ animated: Bool)
Désenregistrer cette notification dans
func viewWillDisappear(_ animated: Bool)
Remarque: - Si vous ne vous désenregistrez pas, il appellera de la classe enfant et provoquera un plantage ou autre.
Option 2: - Son travail fonctionne bien
J'ai obtenu cette réponse de cette source UITextField remonter lorsque le clavier apparaît dans Swift
DANS LE SWIFT 4 ---
la source
J'adore le code Swift propre. Voici donc le code le plus serré que j'ai pu trouver pour déplacer une vue texte vers le haut / bas avec le clavier. Il fonctionne actuellement dans une application de production iOS8 / 9 Swift 2.
MISE À JOUR (mars 2016): Je viens de resserrer mon code précédent autant que possible. En outre, il existe ici un tas de réponses populaires qui codent en dur la hauteur du clavier et les paramètres d'animation. Ce n'est pas nécessaire, sans mentionner que les chiffres dans ces réponses ne correspondent pas toujours aux valeurs réelles que je vois sur mon 6s + iOS9 (hauteur de clavier de 226, durée de 0,25 et courbe d'animation de 7). Dans tous les cas, ce n'est presque pas de code supplémentaire pour obtenir ces valeurs directement du système. Voir ci-dessous.
REMARQUE: ce code couvre le cas le plus général / commentaire. Cependant, plus de code peut être nécessaire pour gérer différentes orientations et / ou claviers personnalisés. Voici un article détaillé sur l'utilisation du clavier iOS. Si vous devez gérer tous les scénarios, cela peut vous aider.
la source
as
pour les lancements de force.as!
peut fonctionner mais comme vous pouvez le voir ailleurs sur cette page, j'évite les lancers de force et le déballage de force moi-même.baseConstraint
il pourrait être aubaseConstraint.constant = moveUp ? keyboardHeight : 0
lieu debaseConstraint.constant = moveUp ? -keyboardHeight : 0
.Edit : je recommande une solution plus simple et plus propre. Modifiez simplement la classe de contrainte d'espacement inférieur en KeyboardLayoutConstraint . Il s'étendra automatiquement à la hauteur du clavier.
Il s'agit d'une version améliorée de la réponse de @JosephLord.
Testé sur iOS 8.3 iPad Simulator, Portrait. Xcode6.3 beta4, j'ai trouvé que sa réponse ne fonctionne pas lorsque le clavier se cache parce qu'il l'
UIKeyboardFrameEndUserInfoKey
est"NSRect: {{0, 1024}, {768, 264}}";
. La hauteur n'est jamais0
.Cela revient à utiliser le traditionnel
UIKeyboardWillShowNotification
etUIKeyboardWillHideNotification
à mieux savoir quand le clavier se cache plutôt que de se fier à la hauteur du cadre final.UIKeyboardWillShowNotification
est également envoyé lorsque le cadre du clavier est modifié, il doit donc couvrir tous les cas d'utilisation.la source
je travaille avec swift 4 et je suis résolu ce problème sans utiliser de contrainte de fond supplémentaire regardez mon code est ici.il fonctionne vraiment sur mon cas
1) Ajouter un observateur de notification dans le chargement
2) Supprimer Notification Observer comme
3) Ajoutez des méthodes d'affichage / masquage du clavier comme
4) Ajouter un délégué textfeild et ajouter des méthodes touchesBegan. Utiles pour masquer le clavier lorsque vous touchez en dehors du textfeild à l'écran
la source
UIKeyboardFrameEndUserInfoKey
NSNotification.Name.UIKeyboardWillShow
est renomméUIResponder.keyboardWillShowNotification
aussiUIKeyboardFrameBeginUserInfoKey
enUIResponder.keyboardFrameBeginUserInfoKey
Il s'agit d'une version améliorée de @JosephLord et de la réponse de @ Hlung. Il peut s'appliquer que vous ayez ou non une barre de tabulations. Et cela rétablirait parfaitement la vue déplacée par le clavier à sa position d'origine.
la source
Le moyen le plus simple qui ne nécessite aucun code:
L'objet se déplace automatiquement vers le haut avec le clavier, en synchronisation.
la source
J'ai créé un protocole Swift 3 pour gérer l'apparence / la disparition du clavier
Ensuite, pour l'implémenter dans un UIViewController, procédez comme suit:
laissez le viewController se conformer à ce protocole:
commencer à observer les modifications du clavier dans viewWillAppear:
arrêter d'observer les changements de clavier dans viewWillDisappear:
créez un IBOutlet pour la contrainte inférieure à partir du storyboard:
(Je recommande d'avoir toute votre interface utilisateur intégrée dans une "contentView" et de lier à cette propriété la contrainte inférieure de cette contentView au guide de mise en page inférieur)
changer la priorité de contrainte de la contrainte supérieure à 250 (faible)
Il s'agit de laisser la vue du contenu entier glisser vers le haut lorsque le clavier apparaît. La priorité doit être inférieure à toute autre priorité de contrainte dans les sous-vues, y compris les priorités d'ajustement de contenu / les priorités de résistance à la compression de contenu.
Vous devrez peut-être ajouter une contrainte «supérieure à égale» pour cela:
Et c'est parti!
la source
import UIKit
Une telle
UIViewController
extension simple peut être utiliséeExemple d'utilisation
Solution Swift 4
Swift 4.2
la source
removeKeyboardObserver()
méthode ici ne supprime pas réellement l'observateur. Si vous n'appelez pas cela, vous verrez unInvalid conditions for UIKeyboardWillChangeFrameNotification
dans la console à partir de la méthode add. Si vous appelez cela, vous verrez la même erreur, ce qui signifie que l'observateur n'est pas supprimé. La documentation indique «Pour annuler l'enregistrement des observations, vous passez l'objet renvoyé par cette méthode àremoveObserver(_:)
». Donc, ce que vous faites à la place est d'enregistrer l'objet retourné par cette méthode, puis de le passer lorsque vous souhaitez supprimer l'observateur.Vous pouvez utiliser cette bibliothèque et une seule ligne de code dans appDidFinishedLaunching et vous avez terminé.
IQKeyboardManager - ajustez la vue chaque fois que le clavier apparaît lien - https://github.com/hackiftekhar/IQKeyboardManager
la source
Et enfin, puisque nous utilisons des méthodes de délégués
refactorisé d'utiliser objective-c http://www.cocoawithlove.com/2008/10/sliding-uitextfields-around-to-avoid.html
la source
var animateDistance: CGFloat!
plus, je devais gérer la UIKeyboardWillHideNotification lorsque l'utilisateur appuie sur le bouton Masquer le clavier.Une autre solution qui ne dépend pas de la mise en page automatique, des contraintes ou des sorties. Ce dont vous avez besoin, c'est de vos champs dans une vue déroulante.
la source
UIKeyboardWillShowNotification
appelé.Voici ma version pour une solution pour Swift 2.2:
Inscrivez-vous d'abord aux notifications Afficher / Masquer le clavier
Ensuite, dans les méthodes correspondant à ces notifications, déplacez la vue principale vers le haut ou vers le bas
L'astuce se trouve dans la partie "keyboardWillShow" qui reçoit des appels à chaque fois que "QuickType Suggestion Bar" est développée ou réduite. Ensuite, nous définissons toujours la coordonnée y de la vue principale qui est égale à la valeur négative de la hauteur totale du clavier (avec ou sans la partie "barre QuickType").
A la fin n'oubliez pas de retirer les observateurs
la source
Ce qui suit est une solution simple, dans laquelle le champ de texte a une contrainte le liant au guide de mise en page inférieur. Il ajoute simplement la hauteur du clavier à la constante de la contrainte.
la source
Eh bien, je pense que je suis peut-être trop tard, mais j'ai trouvé une autre version simple de la réponse de Saqib. J'utilise Autolayout avec des contraintes. J'ai une petite vue à l'intérieur d'une autre vue principale avec des champs de nom d'utilisateur et de mot de passe. Au lieu de modifier la coordonnée y de la vue, j'enregistre la valeur de contrainte d'origine dans une variable et de changer la constante de la contrainte en une certaine valeur, puis à nouveau après le rejet du clavier, je configure la contrainte sur celle d'origine. De cette façon, il évite le problème de la réponse de Saqib (la vue continue de monter et ne s'arrête pas). Voici mon code ...
la source
Réponse Swift 4.x, fusion des réponses de @Joseph Lord et @Isuru.
bottomConstraint
représente la contrainte inférieure de la vue que vous souhaitez déplacer.la source
J'ai fait de la manière suivante:
Ceci est utile lorsque la vue d'ensemble du champ de texte est affichée
la source
la source
J'ai fait de la manière suivante:
la source
Si vous êtes comme moi qui a essayé toutes les solutions ci-dessus et que votre problème n'est toujours pas résolu, j'ai une excellente solution pour vous qui fonctionne comme un charme. Je veux d'abord clarifier quelques points sur certaines des solutions mentionnées ci-dessus.
la source
Voici une solution générique pour toutes les étapes TextField -
1) Créez un ViewController commun qui est étendu par d'autres ViewControllers
2) Créez une extension de UIViewController et du TextField actuellement actif
extension UIViewController {func getSelectedTextField () -> UITextField? {
}
la source
Très simple et pas besoin de coder plus. Ajoutez simplement
pod 'IQKeyboardManagerSwift'
votre podfile, et dans votreAppDelegate
page ajoutez le code ci-dessous.et dans le
didFinishLaunchingWithOptions()
type de méthodec'est ça. consultez ce lien vidéo pour une meilleure compréhension https://youtu.be/eOM94K1ZWN8 J'espère que cela vous aidera.
la source
Code complet pour la gestion du clavier.
la source
J'ai un peu modifié la solution @Simpa .........
la source
Aucun d'eux ne fonctionnait et j'ai fini par utiliser des encarts de contenu pour déplacer ma vue vers le haut lorsque le clavier apparaît.
Remarque: J'utilisais un UITableView
Solution référencée @ keyboard-content-offset qui a été entièrement écrite dans l'objectif C, la solution ci-dessous est Swift propre.
Ajouter l'observateur de notification @ viewDidLoad ()
Pour obtenir la taille du clavier, nous obtenons d'abord le dictionnaire userInfo de l'objet de notification, qui stocke tous les objets supplémentaires que notre récepteur pourrait utiliser.
À partir de ce dictionnaire, nous pouvons obtenir l'objet CGRect décrivant le cadre du clavier en utilisant la clé UIKeyboardFrameBeginUserInfoKey.
Appliquer l'encart de contenu pour la méthode table view @ keyboardWillBeShown,
Restaurer la méthode view @ keyboardWillBeHidden
Si vous souhaitez également tenir compte de l'orientation du périphérique, utilisez des instructions conditionnelles pour adapter le code à vos besoins.
la source
la source
La solution Swift 4 que j'utilise prend la taille du clavier. Remplacez
serverStatusStackView
par la vue qui vous intéresse, par exempleself.view
::la source
La meilleure façon est d'utiliser NotificationCenter pour capturer les actions du clavier. Vous pouvez suivre les étapes de ce court article https://medium.com/@demirciy/keyboard-handling-deb1a96a8207
la source