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 : 582
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 387
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 : 582
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 387
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

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 : 18th September 2019 - 06:54