Swift animations, NSAttributedString |
Bienvenue invité ( Connexion | Inscription )
Swift animations, NSAttributedString |
11 Sep 2019, 08:52
Message
#1
|
|
Macbidouilleur d'argent ! Groupe : Membres Messages : 659 Inscrit : 7 May 2015 Membre no 195 224 |
Bonjour,
Je cherche à faire une petite application. N'ayant aucune notion pour créer une interface graphique en C, je me suis lancé dans les outils que propose Apple, à savoir Swift/XCode Y'a pas à dire, la syntaxe de leur language est SUPER lourdingue ! Bref. J'avances pas à pas et j'aimerais maintenant animer une portion de texte d'un UILabel (une syllabe) Dans l'idéal, je voudrais :
Voilà ce que j'ai écrit : Dans ma classe qui contient ces UILabel, je définis mes couleurs et mes modifications de textes (je passe par une fonction car je n'ai pas trouvé comment faire une ombre dans la déclaration) : Code let colors = [ "unreaded": UIColor(red: 66/255, green: 66/255, blue: 66/255, alpha: 1), "readed": UIColor(red: 233/255, green: 128/255, blue: 43/255, alpha: 1) ] var readedStyle :[NSAttributedString.Key : Any] = [:] func defStyles(size :textSize) { self.readedStyle[NSAttributedString.Key.foregroundColor] = self.colors["readed"] let shadow = NSShadow() shadow.shadowOffset = CGSize(width: 2, height: 2) shadow.shadowColor = UIColor.darkGray shadow.shadowBlurRadius = 2 self.readedStyle[NSAttributedString.Key.shadow] = shadow } Ensuite, j'ai ajouté une extension à la classe UILabel : Code extension UILabel { // startPos : // endPos : // style : list of styles to apply to range func posTextStyleChange (endPos :Int, startPos: Int, style :[NSAttributedString.Key : Any]) { // Change text color to <style> between <startPos> and <endPos> let range = NSRange(location: startPos, length: endPos-startPos) let attribute = NSMutableAttributedString.init(string: self.text!) //attribute.addAttribute(NSAttributedString.Key.foregroundColor, value: UIColor.yellow, range: range) attribute.addAttributes(style, range: range) self.attributedText = attribute UIView.animate(withDuration: 0.2, delay: 0, usingSpringWithDamping: 0.2, initialSpringVelocity: 5, options: [.autoreverse, .curveEaseInOut], animations: { () -> Void in self.transform = CGAffineTransform(scaleX: 1.3, y: 1.3) }, completion: { (result: Bool) -> Void in self.transform = .identity }) } } Evidemment, dans ce code, mon animation s'applique à tout le UILabel. Je ne vois pas comment je pourrais ne l'appliquer qu'à une partie. Si vous coonnaissez une solution, je suis tout ouïe. En revanche, je ne comprends pas du tout pourquoi l'ombre ne fonctionne pas du tout comme prévu :
Une idée ? Merci pour votre aide Ce message a été modifié par Anard - 11 Sep 2019, 09:14. -------------------- "iMack" : GA-H97M-D3H, Intel i5 4460, 16Go DDR3,
"Portable" : HP Pavilion DV3500, Intel core2 T6400, 4Go DDR3, NVidia GeForce 9300M, HDD 256Go / Grub2 - Gentoo-Xfce |
|
|
18 Sep 2019, 09:04
Message
#2
|
|
Macbidouilleur d'argent ! Groupe : Membres Messages : 659 Inscrit : 7 May 2015 Membre no 195 224 |
Bonjour, et merci pour tes réponses.
Concernant SwiftUI, je ne comprends pas bien. Tu veux dire qu'une app construite sur cette base serait installable sur des plateformes plus anciennes ? Dans l'idée, je cherche à créer une application toute simple : réception de données Midi "temps-réel" via l'adaptateur Bluetooth (je me charge également de la partie emetteur, depuis un µControlleur PIC, donc si besoin je peux aussi envoyer d'autres messages que du Midi pur) et affichage des paroles à l'écran à la manière d'un karaoké. Pour pouvoir faire apparaître les textes avant qu'une syllabe n'apparaisse, le µC commence un morceau par l'envoi de tous les textes avant la lecture temps réel. Ca prend un peu de temps mais ça permet de tout enregistrer en RAM du point de vue du récepteur et de ne plus m'en soucier au niveau du PIC (qui est limité en Ram et en cadence de fonctionnement). Je n'utilise pas de base de données, je stocke le tout à la bourrin dans un array de string… Pour ce qui est de l'API BLE, je suis parti de ce projet et j'ai trouvé plusieurs autres exemples sous Swift. Donc c'est OK, en tout cas pour iOS/macOS Pour le reste du logiciel (interprétation des données reçues et gestion de certaines erreurs de réception), c'est bon. Vu la simplicité de la chose, je pense qu'en prenant le temps de lire un peu, je pourrais m'adapter à un autre language, mais vu comme ça se mélange vite dans ma tête, je préfère éviter de mélanger les syntaxes au sein du projet si c'est possible. Python a l'air assez répandu, pourtant j'ai beaucoup de mal. Il m'est arrivé souvent de ne pas parvenir à installer une appli créée sous Python sur un OS, alors ça donne pas trop envie (bien que le problème vienne probablement de moi). Les applis Java ou utilisant X11 sur Mac n'ont au final pas un aspect très "natives". Du coup, pour le moment, j'ai réussi à faire quelque chose d'à peu près fonctionnel sur iOS en Swift/UIKit. J'essaie de le migrer sur macOS pour essayer de comprendre la démarche (en bonne voie, même si pas vraiment nécessaire pour mon usage final). Ca me permet surtout de ranger un peu ce que j'ai écrit et de bien séparer le Modèle, la Vue et le Conrôlleur. Bref, j'essaie d'apprendre doucement. Au final, je voudrais que mon appli tourne en priorité sur RasPi (donc sur Linux), ensuite iOS voire si possible Android. Dans l'idée, je veux qu'elle soit compatible avec les plateformes les plus anciennes possibles (disons Debian 7 - iOS 10). Concernant le BT, j'espère grandement que le module CoreBluetooth utilisé actuellement pour la réception BLE fonctionnera de la même manière sous Linux . C'est surtout au niveau du GUI que je ne sais pas trop quoi faire. D'autant que tout ça n'est pas très clair dans ma tête. Si j'ai bien compris, c'est le travail de UIKit sur iOS et AppKit sur macOS, malheureusement incompatibles sur d'autre plateformes. Pour passer sur Linux, il me faudra autre chose… qui n'est apparemment pas intégré à XCode. J'ai trouvé sur Github plusieurs branches de SwiftGtk, mais je n'arrive pour le moment rien à faire fonctionner. En fait j'aimerais, de la même manière que précédemment pour créer une version macOS, n'avoir qu'à ajouter une cible à mon projet (mais dans l'onglet "cross-platform d'XCode", je ne vois pas trop quoi choisir) et faire joujou avec l'InterfaceBuilder pour adapter mon interface à cette plateforme. Si SwiftUI pouvait faire le boulot, ce serait probablement très bien (même si je dois me passer de l'InterfaceBuilder) mais je crois avoir compris que le résultat ne sera pas compatible pour des plateformes plus anciennes. Malheureusement, je crois que ce ne sera pas si simple. Déjà, est-ce que je peux compiler et tester du code pour Linux depuis XCode sur Mac ou est-ce que je dois nécessairement compiler sur un PC sous Linux (et donc en ligne de commande ou avec un autre logiciel qu'XCode) ? Ce message a été modifié par Anard - 18 Sep 2019, 09:22. -------------------- "iMack" : GA-H97M-D3H, Intel i5 4460, 16Go DDR3,
"Portable" : HP Pavilion DV3500, Intel core2 T6400, 4Go DDR3, NVidia GeForce 9300M, HDD 256Go / Grub2 - Gentoo-Xfce |
|
|
Nous sommes le : 1st May 2024 - 16:50 |