iOS 13 sous la loupe

Le type dynamique est bon, mais il ne fonctionne pas toujours. Maintenant, je vais vous dire comment les petits contrôles dans iOS 13 augmentent gratuitement, sans inscription ni SMS.


Dans un article précédent, nous avons tiré le type dynamik dans le menu de l'application iOS Dodo Pizza. Cela s'est plutôt bien passé. Mais la barre d'onglets sous le menu était aussi petite qu'elle l'était - elle ne change pas en fonction du paramètre de taille du texte.


Cette fonctionnalité n'a pas encore atteint la sortie, pour laquelle j'ai honte et honte

"Mais comment ça va, Dodo?" Vous ne vous souciez pas des personnes malvoyantes?
- Désolé!

Un peu sur le mode intégré "Loupe"


La barre d'onglets système affiche un aperçu de chaque onglet en appuyant longuement. Essayez d'inclure la taille du texte «disponible», puis appuyez longuement sur n'importe quel onglet de l'onglet système (par exemple, dans Musique ou dans Photo). La fenêtre contextuelle suivante apparaîtra à l'écran:


En plus de la barre d'onglets, le mode «loupe» est soutenu par des boutons dans les barres de navigation et les barres d'outils:


Champs de recherche:


Et quelques contrôles supplémentaires.

Et, à partir d'iOS 13, nous pouvons facilement ajouter le même comportement à nos contrôles.

Comment fixer UILargeContentViewerItem à l'application


Malheureusement, ce protocole est assez mal décrit dans la documentation, mais cela n'a pas d'importance, car son API semble assez simple:

@available(iOS 13.0, *) public protocol UILargeContentViewerItem : NSObjectProtocol { var showsLargeContentViewer: Bool { get } var largeContentTitle: String? { get } var largeContentImage: UIImage? { get } var scalesLargeContentImage: Bool { get } var largeContentImageInsets: UIEdgeInsets { get } } 

Il suffit de mettre en œuvre plusieurs de ces méthodes, dont les noms parlent d'eux-mêmes, et votre contrôle affichera un grand aperçu sur un long tap.

Mise en œuvre très simple


Essayons ce protocole sur un bouton de l'application. Par exemple, sur le bouton i de la fiche produit:


Ajoutez 3 lignes de code:

 nutritionButton.showsLargeContentViewer = true nutritionButton.addInteraction(UILargeContentViewerInteraction()) nutritionButton.largeContentTitle = nutritionButton.accessibilityValue 


C'est fait. Cool, hein?

Seulement voici l'icône paire, qui est tirée par défaut, je n'aime pas. Ce sera mieux si ce n'est pas bicolore, mais unicolore avec la forme découpée de la lettre i . Ceci est juste utilisé pour l'état du bouton.

 nutritionButton.largeContentImage = nutritionButton.image(for: .highlighted) 


Norm

Et maintenant, terminons dans l'extension:

 extension UIView { public func enableLargeContent(title: String? = nil, image: UIImage? = nil, scales: Bool = true, insets: UIEdgeInsets = .zero) { guard !showsLargeContentViewer else { return } showsLargeContentViewer = true addInteraction(UILargeContentViewerInteraction()) largeContentTitle = title largeContentImage = image scalesLargeContentImage = scales largeContentImageInsets = insets } } 

 nutritionButton.enableLargeContent(title: nutritionButton.accessibilityValue, image: nutritionButton.image(for: .highlighted)) 

En fait, de nombreux contrôles ios standard implémentent déjà certaines des méthodes de ce protocole. Et ce mode est désactivé, car vous devez essayer d'augmenter vraiment le contenu, plutôt que de tout cacher derrière une loupe.

Je reformule: n'utilisez cette fonctionnalité qu'en dernier recours, lorsque vous ne pouvez vraiment pas augmenter le contrôle.
La documentation pour tout cela est disponible dans Xcode si vous ouvrez l'interface UILargeContentViewerItem .


Projet de démonstration dans mon dépôt sur GitHub

Source: https://habr.com/ru/post/fr463151/


All Articles