IPB

Bienvenue invité ( Connexion | Inscription )

 
Reply to this topicStart new topic
> Swift animations, NSAttributedString
Options
Anard
posté 11 Sep 2019, 08:52
Message #1


Macbidouilleur d'argent !
***

Groupe : Membres
Messages : 589
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 :
  • que la couleur du texte change
  • qu'il lui soit ajoutée une ombre
  • que cette portion ait un effet de "rebond", un léger grossissement puis un retour à la normale, avec quelques rebonds


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 :
  • si la position startPos > 0, alors c'est OK
  • si la position startPos = 0, alors tout le label prend l'ombre. La couleur, elle, n'est appliquée qu'à la partie voulue… dry.gif


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, Asus GTX670, SSD 128+120+60Go, HDD 500Go+2To / Clover - macOS Mojave / Ubuntu Bionic Beaver / Windows 10
"Portable" : Samsung P200, Intel Core2Duo T8100, 3Go DDR2, Radeon X1250, HDD 160Go / Grub2 - SliTaz 5.0 rolling / Windows 10
Go to the top of the page
 
+Quote Post
Jaypee
posté 12 Sep 2019, 11:55
Message #2


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 2 391
Inscrit : 29 Aug 2002
Membre no 3 340



Apparemment, pour la création d'interface utilisateur, Apple promeut désormais SwiftUI qui est d'un haut niveau d'abstraction, avec beaucoup de magie invisible.
Le style de programmation est plutôt déclaratif et fonctionnel qu'impératif.

On trouve beaucoup de tutos en ligne, notamment ici: https://www.raywenderlich.com/3715234-swift...getting-started

Exemple du Tuto d'Apple il me semble, il y a longtemps que je l'ai essayé... me souviens plus très bien sad.gif
CODE
import PlaygroundSupport
import SwiftUI
extension UIView {
var renderedImage: UIImage {
let image = UIGraphicsImageRenderer(size: self.bounds.size).image { context in
UIColor.lightGray.set(); UIRectFill(bounds)
context.cgContext.setAlpha(0.75)
self.layer.render(in: context.cgContext)
}
return image
}
}
extension View {
var renderedImage: UIImage {
let window = UIWindow(frame: CGRect(origin: .zero, size: CGSize(width: 320, height: 160)))
let hosting = UIHostingController(rootView: self)
hosting.view.frame = window.frame
window.rootViewController = hosting
window.makeKey()
return hosting.view.renderedImage
}
}

Text("Hello").renderedImage

Slider(value: .constant(0.5)).renderedImage
let img = ([Color.red, .orange, .yellow, .green, .blue, .purple]
.reduce(AnyView(Text("������").font(.largeTitle) // Ce sont 2 emoticons de fillettes.
.rotationEffect(Angle(radians: .pi)))) {
AnyView($0.padding()
.background($1)
.rotationEffect(Angle(radians: .pi / 6)))
}).renderedImage
img


Voir image jointeFichier joint  SwiftUI_exemple.png ( 77.94 Ko ) Nombre de téléchargements : 4

J-P

Ce message a été modifié par Jaypee - 12 Sep 2019, 14:53.
Go to the top of the page
 
+Quote Post
Anard
posté 15 Sep 2019, 13:53
Message #3


Macbidouilleur d'argent !
***

Groupe : Membres
Messages : 589
Inscrit : 7 May 2015
Membre no 195 224



Merci pour ta réponse.
Malheureusement, j'ai cru lire que SwiftUI n'est compatible qu'à partir de Catalina / iOS 13, pas très accessible quoi
Dommage parce qu'en dehors de ça, la portabilité du code m'intéresserait.

En fait, je me suis lancé dans Swift/XCode parce que je n'ai aucune notion de la création d'interface graphique (simple) autrement.
Je ne peux pas non plus passer par une interface web (HTML/CSS/PHP), ce qui serait encore l'idéal pour emmener sur le code sur n'importe quelle plateforme, parce que mes données arrivent depuis l'adaptateur Bluetooth du iPhone/iPad/truc. Encore qu'apparemment, Chrome commence à intégrer une API qui permet de gérer des données depuis le BT.

Ce message a été modifié par Anard - 15 Sep 2019, 13:56.


--------------------
"iMack" : GA-H97M-D3H, Intel i5 4460, 16Go DDR3, Asus GTX670, SSD 128+120+60Go, HDD 500Go+2To / Clover - macOS Mojave / Ubuntu Bionic Beaver / Windows 10
"Portable" : Samsung P200, Intel Core2Duo T8100, 3Go DDR2, Radeon X1250, HDD 160Go / Grub2 - SliTaz 5.0 rolling / Windows 10
Go to the top of the page
 
+Quote Post
Jaypee
posté 16 Sep 2019, 10:20
Message #4


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 2 391
Inscrit : 29 Aug 2002
Membre no 3 340



Justement, le premier "import PlaygroundSupport" devra disparaître avec Catalina, et c'est donc le "workaround" provisoire nécessaire pour tester dans le playground, et je ne suis pas en Catalina, mais en Mojave.

Tu dois faire les deux tiers (visu et API service) ou seulement la visu ?

Il y a cette liste sur GitHub pour la visu sur IOS: https://github.com/fasouto/awesome-dataviz#ios-tools

Pour l'API, Python et Flask sont très bien. Le langage Go et Hugo sont aussi souvent cités.

Mais si tu tiens à rester mono-langage, avec du Swift côté serveur, il y a Vapor qui est en plein développement. https://vapor.codes

Pour l'interface BT ou BLE, https://www.polidea.com/blog/RxBluetoothKit...de_BLE_devices/

@+
JP

Ce message a été modifié par Jaypee - 16 Sep 2019, 13:27.
Go to the top of the page
 
+Quote Post
Anard
posté 18 Sep 2019, 09:04
Message #5


Macbidouilleur d'argent !
***

Groupe : Membres
Messages : 589
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 confused5.gif .
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, Asus GTX670, SSD 128+120+60Go, HDD 500Go+2To / Clover - macOS Mojave / Ubuntu Bionic Beaver / Windows 10
"Portable" : Samsung P200, Intel Core2Duo T8100, 3Go DDR2, Radeon X1250, HDD 160Go / Grub2 - SliTaz 5.0 rolling / Windows 10
Go to the top of the page
 
+Quote Post
Jaypee
posté 18 Sep 2019, 10:23
Message #6


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 2 391
Inscrit : 29 Aug 2002
Membre no 3 340



Non, tu peux aujourd'hui utiliser Mojave pour t'entrainer à SwiftUI, mais le produit fini aura besoin de Catalina ou IOS 13. Je crains que tu doive garder SwiftUI sous le coude car c'est le futur, mais ce n'est pas ce qui permet de supporter une base large de clients. Le dilemme est créé volontairement par les constructeurs qui cherchent à capturer le maximum de part.s de marché.

L'interface Builder est en fin de vie avec SwiftUI qui ne l'utilise plus, donc n'investit pas trop dessus. Idem pour Xcode : Si tu t'appuies dessus pour la facilité d'ajouter une cible, tu aurais intérêt à te concentrer tout de suite sur le mécanisme du build et de la gestion du multiplateforme en général.

Sans analyse trop poussée, il me semble que tu es dans un cas typique où il faut coller à un standard comme ECMAscript (the language formally known as JavaScript smile.gif ) et un environnement basé sur Nodejs, comme AngularJS. Pour compliquer, beaucoup d'outils "transpilent" en JavaScript. Des langages de plus haut niveau, fortement typés, qui sont ensuite traduits, transpilés, en JS.
Choix des outils : https://www.dunebook.com/angular-ide/
Et Swift n'y échappe pas smile.gif https://github.com/shift-js/shift-js

Il existe des API de streaming du MIDI comme https://github.com/mmckegg/web-midi
A propos de MIDI over Bluetooth, on voit quelques démos sur YT : https://www.youtube.com/watch?v=eKnC9_Buxus

Les choses bougent à toute vitesse, et l'outillage est de plus en plus abondant. Et n'oublie pas de regarder aussi des avancées de l'IA dans le domaine créatif, ça aussi ça avance à toute vitesse, et si tu as besoin de la puissance de calcul d'un GPU dans un format Raspberry Pi, il y a NVIDIA Jetson Nano, mais attention, c'est encore très "vert", tout ce qui tourne sous Linux, n'est pas forcément opérationnel sur ces nouveaux processeurs.

Bon courage, beau projet, tiens bon !
@+JP
Go to the top of the page
 
+Quote Post
Anard
posté 18 Sep 2019, 23:32
Message #7


Macbidouilleur d'argent !
***

Groupe : Membres
Messages : 589
Inscrit : 7 May 2015
Membre no 195 224



Merci beaucoup à toi.

Le principe de la transpilation ( huh.gif ), c'est de convertir le swift ou autre en JS pour ensuite l'executer sur n'importe quelle plateforme, si j'ai bien compris.
Mais il a toujours besoin d'un navigateur pour interprter le résultat ou est-ce qu'il peut générer un interface graphique tout seul ?
J'imagine que la gestion Bluetooth (ou l'accès à un autre matériel physique) dépend toujours de la plateforme.
Enfin, il faut que je continue à lire tout ça. smile.gif

Aussi, dans mes recherches, je suis tombé sur un dépôt conçu pour moi : https://github.com/PureSwift
Principalement Cacao qui semble transcrire UIKit pour Linux.
Si je comprends bien ceci, le code généré est directement utilisable sur iOS, tvOS et Linux (exactement ce dont j'ai besoin)
Code
#if os(iOS) || os(tvOS)

import UIKit

let _ = UIApplicationMain(0, nil, nil, NSStringFromClass(AppDelegate.self))

#else

import Cacao

var options = CacaoOptions()
options.windowName = "CacaoDemo"
UIApplicationMain(delegate: AppDelegate.shared, options: options)
    
#endif


Resterait uniquement à adapter la réception avec BluetoothLinux. Encore que là-aussi, s'il utilisent les même noms de classes et le même fonctionnement que la bibliothèque Apple, ça simplifie la migration.
Ils proposent égalemet des bibliothèques pour Android au cas où.
Pour courronner le tout, Cacao arrive dans un package Xcode qui compile immédiatement ! smile.gif Je sais que c'est pas le top, mais pour le moment il m'aide encore beaucoup à y voir un peu moins flou...

Ceci dit, je ne sais pas à quel stade de développement en sont ces bibliothèques et j'ai du mal à trouver des retours d'utilisation.

Ce message a été modifié par Anard - 18 Sep 2019, 23:46.


--------------------
"iMack" : GA-H97M-D3H, Intel i5 4460, 16Go DDR3, Asus GTX670, SSD 128+120+60Go, HDD 500Go+2To / Clover - macOS Mojave / Ubuntu Bionic Beaver / Windows 10
"Portable" : Samsung P200, Intel Core2Duo T8100, 3Go DDR2, Radeon X1250, HDD 160Go / Grub2 - SliTaz 5.0 rolling / Windows 10
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 utilisateur(s) sur ce sujet (1 invité(s) et 0 utilisateur(s) anonyme(s))
0 membre(s) :

 



Nous sommes le : 24th October 2019 - 01:01