[SWIFT] Comment ajuster TextPosition avec l'extension de clavier iOS

Utilisez ʻadjustTextPosition (byCharacterOffset: Int) `pour déplacer le curseur dans l'extension de clavier iOS. Documentation est parfait

To move the insertion point in the text input view, use the adjustTextPosition(byCharacterOffset:) method. For example, if you want to implement a forward delete action, move the insertion position forward by one character then delete backwards:

// Move the text insertion position forward 1 character (Avancer d'un caractère)
textDocumentProxy.adjustTextPosition(byCharacterOffset: 1)

Cela dit, mais c'est un ** piège **. Je pense que c'est difficile à remarquer, alors je vais le partager.

S'il est implémenté de cette manière, il se comportera comme ceci. ezgif-5-786edace6467.gif

Cela fonctionne bien jusqu'à "aiueo", mais cela semble étrange au point d'atteindre les kanji et les pictogrammes.

Solutions

Apparemment, cette méthode compte "un caractère" par le nombre de caractères lorsque ʻutf16 est utilisé. Vérifions donc les caractères dans le sens du déplacement avant de l'exécuter, puis ʻadjustTextPosition.

func getActualOffset(count: Int)->Int{
    if count>0{
        if let after = textDocumentProxy.documentContextAfterInput{
            if after == ""{
                return 1   //S'il y a un saut de ligne avant un caractère, après==""Sera.
            }
            let left = after.prefix(count)
            return left.utf16.count
        }else{
            return 1
        }
    }else if count<0{
        if let before = textDocumentProxy.documentContextBeforeInput{
            let right = before.suffix(-count)
            return -right.utf16.count
        }else{
            return -1
        }
    }else{
        return 0
    }
}

let offset = getActualOffset(count: 1) //Obtenez le décalage exact
textDocumentProxy.adjustTextPosition(byCharacterOffset: offset) //Courir

Cela fonctionne comme prévu. ezgif-5-410ac0a2f5c8.gif

Soyez prudent car c'est un piège caché dans un endroit difficile à remarquer.

Recommended Posts

Comment ajuster TextPosition avec l'extension de clavier iOS
Comment numéroter (nombre) avec html.erb
Comment mettre à jour avec activerecord-import
[iOS] Comment lire Carthage
Comment démarrer avec Slim
Comment entourer n'importe quel caractère avec "~"
Comment utiliser mssql-tools avec Alpine
Comment démarrer Camunda avec Docker
Comment recadrer une image avec libGDX
Comment partager des fichiers avec Docker Toolbox
Comment compiler Java avec VsCode & Ant
[Java] Résumez comment comparer avec la méthode equals
[Android] Comment gérer les thèmes sombres
Comment utiliser BootStrap avec Play Framework
Comment changer d'images miniatures avec JavaScript
[Note] Comment démarrer avec Rspec
Comment faire un contrôle basé sur l'API avec cancancan
Comment réaliser le téléchargement de fichiers avec Feign
Comment mettre à jour les modèles associés avec accepte_nested_attributes_for
Comment définir JAVA_HOME avec l'appassembler-maven-plugin de Maven
Comment implémenter TextInputLayout avec la fonction de validation
Comment gérer les erreurs de connexion avec l'appareil
Comment supprimer des données avec une clé externe
Comment tester l'étendue privée avec JUnit
Comment surveiller nginx avec docker-compose avec datadog
Nécessaire pour iOS 14? Comment définir NSUserTrackingUsageDescription
Comment gérer les actifs de précompilation a échoué.
Comment réaliser le téléchargement de fichiers avec Feign
Comment exécuter Blazor (C #) avec Docker
Comment créer un environnement Rails 6 avec Docker
Comment télécharger Oracle JDK 8 rpm avec curl
Comment se moquer de chaque cas avec Mockito 1x
Comment se moquer de chaque cas avec PowerMock + Mockito1x
Comment utiliser MyBatis2 (iBatis) avec Spring Boot 1.4 (Spring 4)
Comment enregistrer dans plusieurs tables avec une seule entrée
Comment tester les interruptions pendant Thread.sleep avec JUnit
Comment utiliser h2db intégré avec Spring Boot
Comment utiliser le framework Java avec AWS Lambda! ??
Comment créer plusieurs menus déroulants avec ActiveHash
Comment utiliser l'API Java avec des expressions lambda
Comment démarrer avec Eclipse Micro Profile
Comment donner votre image à quelqu'un avec Docker
Comment tout insérer en même temps avec MyBatis
Comment écrire du code de test avec la certification de base
Comment créer une API avec GraphQL et Rails
Comment utiliser le protocole NFS version 2 avec Ubuntu 18.04
Comment sortir un fichier de ressources avec spring-boot
Comment créer des variables membres avec le modèle JPA
Comment vérifier les éléments variables avec RequestBodyMatching de WireMock
[Rails] Comment créer un environnement avec Docker