Dans ce didacticiel, nous examinerons certaines des fonctionnalités avancées et les schémas d’utilisation de l’humble UIImage
classe dans iOS. À la fin de ce didacticiel, vous aurez appris ce qui suit: comment créer des images en code, comment créer des images redimensionnables pour des éléments d'interface utilisateur tels que des légendes et comment créer des images animées.
Si vous avez déjà eu à afficher une image dans votre application iOS, vous connaissez probablement déjà UIImage
. C'est la classe qui vous permet de représenter des images sur iOS. C’est de loin le moyen le plus courant d’utiliser UIImage
Et c'est assez simple: vous avez un fichier image dans l'un des formats d'image standard (PNG, JPEG, BMP, etc.) et vous souhaitez l'afficher dans l'interface de votre application. Vous instanciez un nouveau UIImage
par exemple en envoyant le message de la classe imageNamed:
. Si vous avez une instance de UIImageView
, vous pouvez régler sa image
propriété à la UIImage
exemple, puis vous pouvez coller la vue d’image dans votre interface en la configurant comme sous-vue de votre vue à l’écran:
UIImage * img = [UIImage imageNamed: nom_fichier]; UIImageView * imgView = [[UIImageView alloc] initWithImage: img]; // Définir le cadre, etc… [self.view addSubview: imgView];
Vous pouvez également effectuer l'équivalent de la procédure ci-dessus directement dans Interface Builder..
Il existe d'autres moyens d'instancier une image, par exemple à partir d'une URL ou d'une image archivée stockée sous forme de fichier. NSData
tapez, mais nous ne nous concentrerons pas sur ces aspects dans ce tutoriel.
Avant de parler de la création d’images en code, rappelons qu’au niveau le plus primitif, nous savons ce qu’est une image 2D: un tableau bidimensionnel de valeurs de pixels. La région de mémoire représentant la matrice de pixels pour une image est souvent appelée son magasin de bitmap. Il est parfois utile de garder cela à l'esprit lors de la prise en compte de la mémoire. Cependant, il est important de réaliser qu’un UIImage
Il s’agit en réalité d’une abstraction d’une image de niveau supérieur à celle d’une matrice de pixels, optimisée en fonction des exigences et des scénarios d’utilisation d’une plate-forme mobile. Bien qu’il soit théoriquement possible de créer une image en ajoutant des valeurs à un tableau de pixels entier, ou d’entrer dans le bitmap d’une image existante et de lire ou de modifier la valeur d’un pixel individuel, il est plutôt gênant de le faire sur iOS et n’est pas vraiment utile. facilitée par l'API. Cependant, étant donné que la majorité des développeurs d'applications ont rarement besoin de manipuler des images au niveau des pixels, ce n'est généralement pas un problème..
Quoi UIImage
(ou plus généralement, UIKit et Core Graphics) facilite la tâche du développeur est de créer une nouvelle image en composant de manière intéressante des images existantes ou de générer une image en pixellisant un dessin vectoriel construit à l'aide de UIKitde UIBezierPath
classe ou graphique de base CGPath…
les fonctions. Si vous voulez écrire une application qui permet à l'utilisateur de créer un collage de ses images, il est facile de faire avec UIKit et UIImage
. Si vous avez développé, par exemple, une application de dessin à main levée et que vous souhaitez laisser l'utilisateur enregistrer sa création, l'approche la plus simple consiste à extraire un fichier. UIImage
du contexte de dessin. Dans la première partie de ce didacticiel, vous apprendrez exactement comment ces deux idées peuvent être mises en œuvre.!
Il est important de garder à l'esprit qu'un UIImage
construit de cette manière n’est pas différent d’une image obtenue en ouvrant une photo de l’album photo ou en la téléchargeant sur Internet: elle peut être enregistrée dans les archives ou téléchargée dans l’album photo ou affichée dans un fichier. UIImageView
.
Redimensionnement d'image est un type important de manipulation d'image. Évidemment, vous voudriez éviter d'agrandir une image, car cela nuirait à la qualité et à la netteté de l'image. Cependant, il existe certains scénarios dans lesquels des images redimensionnables sont nécessaires et il existe en fait des moyens judicieux de le faire pour ne pas dégrader la qualité de l'image.. UIImage
répond à cette situation en autorisant les images ayant une zone interne redimensionnable et des "incrustations de bord" sur les bordures d'image qui se redimensionnent dans une direction particulière ou qui ne le font pas du tout. De plus, le redimensionnement peut être effectué en mosaïque ou en étirant les portions redimensionnables pour obtenir deux effets légèrement différents qui peuvent être utiles dans différentes situations..
La deuxième partie de la mise en œuvre montrera une mise en œuvre concrète de cette idée. Nous allons écrire une petite classe astucieuse qui peut afficher n'importe quelle quantité de texte dans une image redimensionnable!
Enfin, nous allons parler un peu d’animation d’images avec UIImage
. Comme vous pouvez probablement le deviner, cela signifie "jouer" une série d’images successives, ce qui donne l’illusion de l’animation un peu comme les GIF animés que vous voyez sur Internet. Bien que cela puisse sembler un peu limité, dans des situations simples UIImage
La prise en charge des images animées est peut-être ce dont vous avez besoin. Il suffit de quelques lignes de code pour être opérationnel. C'est ce que nous verrons dans la troisième et dernière section de ce tutoriel! Il est temps de se retrousser les manches et de se mettre au travail!
Créer un nouveau projet iOS dans Xcode, avec le "Application vide"modèle. Appelez-le "UIImageFun". Cochez l'option pour le comptage automatique des références, mais décochez les options pour les données de base et les tests unitaires.
Création d'un nouveau projet XcodeUne petite remarque avant de poursuivre: ce didacticiel utilise plusieurs ensembles d’images. Pour obtenir ces images, vous devez cliquer à l’emplacement où il est indiqué "Télécharger les fichiers sources" en haut de cette page. Après avoir téléchargé et décompressé l'archive, faites glisser le dossier intitulé "Images" dans le navigateur de projet - l'onglet le plus à gauche dans le volet de gauche de Xcode. Si le volet de gauche n'est pas visible, appuyez sur la combinaison de touches. + 0 pour le rendre visible et vous assurer que l'onglet le plus à gauche - dont l'icône ressemble à un dossier - est sélectionné.
Glissez et déposez le dossier Images dans votre projet Assurez-vous que le "Copier des éléments dans le dossier du groupe de destination (si nécessaire)"l'option dans la boîte de dialogue est cochée". Assurez-vous que les fichiers sont copiés dans votre dossier de projetLe fichier téléchargé contient également le projet Xcode complet avec les images déjà ajoutées au projet, au cas où vous seriez coincé quelque part..
Créez un nouveau fichier pour une classe Objective-C, appelez-le ViewController
et en faire une sous-classe de UIViewController
. Assurez-vous que les options relatives à iPad et XIB ne sont pas cochées.
Remplacer tout le code dans ViewController.m avec ce qui suit:
#import "ViewController.h" @interface ViewController () UIImage * img; UIImageView * iv; NSMutableArray * ivs; @end @implementation ViewController - (void) viewDidLoad [super viewDidLoad]; // (1) Création d'un contexte bitmap, le remplissant avec le jaune comme couleur "d'arrière-plan": CGSize size = CGSizeMake (self.view.bounds.size.width, self.view.bounds.size.height); UIGraphicsBeginImageContextWithOptions (CGSizeMake (size.width, size.height), YES, 0.0); [[UIColor yellowColor] setFill]; UIRectFill (CGRectMake (0, 0, size.width, size.height)); // (2) Créez un cercle via un chemin Bézier et remplissez-le dans le contexte bitmap: UIBezierPath * bezierPath = [UIBezierPath bezierPathWithArcCenter: CGPointMake (size.width / 2, size.height / 2) radius: 140 startAngle: 0 endAngle: 2 * M_PI dans le sens des aiguilles d'une montre: YES]; [[UIColor blackColor] setStroke]; bezierPath.lineWidth = 5.0; [accident vasculaire cérébral]; [[UIColor redColor] setFill]; [remplissage bezierPath]; // (3) Création d'un tableau d'images: NSArray * rocks = @ [[UIImage imageNamed: @ "rock1"], [UIImage imageNamed: @ "rock2"], [UIImage imageNamed: @ "rock3"], [UIImage imageNamed : @ "rock4"], [UIImage imageNamed: @ "rock5"], [UIImage imageNamed: @ "rock6"], [UIImage imageNamed: @ "rock7"], [UIImage imageNamed: @ "rock8"], [UIImage imageNamed : @ "rock9"]]; // (4) Dessiner des roches en boucle, chacune choisie de manière aléatoire dans l'ensemble d'images et dessinée à un emplacement aléatoire selon un motif circulaire: for (int i = 0; i < 100; i++) int idx = arc4random() % rocks.count; NSLog(@"idx = %d", idx); int radius = 100; int revolution = 360; float r = (float)(arc4random() % radius); float angle = (float)(arc4random() % revolution); float x = size.width/2 + r * cosf(angle * M_PI/180.0); float y = size.height/2 + r * sinf(angle * M_PI/180.0); CGSize rockSize = ((UIImage *)rocks[idx]).size; [rocks[idx] drawAtPoint:CGPointMake(x-rockSize.width/2, y-rockSize.height/2)]; // (5) Deriving a new UIImage instance from the bitmap context: UIImage *fImg = UIGraphicsGetImageFromCurrentImageContext(); // (6) Closing the context: UIGraphicsEndImageContext(); // (7) Setting the image view's image property to the created image, and displaying iv = [[UIImageView alloc] initWithImage:fImg]; [self.view addSubview:iv]; @end
Configurez le délégué d’application pour utiliser une instance de ViewController
en tant que contrôleur de vue racine en remplaçant le code dans AppDelegate.m avec ce qui suit:
#import "AppDelegate.h" #import "ViewController.h" @implementation AppDelegate - (BOOL) application: (UIApplication *) application didFinishLaunchingWithOptions: (NSDictionary *) launchOptions self.window = [[UIWindow alloc]]. écran principal] bornes]]; self.window.rootViewController = [[ViewController alloc] init]; self.window.backgroundColor = [UIColor whiteColor]; [self.window makeKeyAndVisible]; retourner OUI; @fin
Examinons le code pour viewDidLoad:
où toute l'action se passe. Nous nous référerons aux nombres dans le contexte du code.
UIGraphicsBeginImageContextWithOptions ()
une fonction. Cette fonction prend comme arguments un CGSize
, que nous avons défini à la taille de la vue de notre contrôleur de vue, ce qui signifie l'écran entier. le BOOL
dites-nous si le contexte est opaque ou non. Un contexte opaque est plus efficace, mais vous ne pouvez pas le "voir à travers". Puisqu'il n'y a rien d'intéressant dans notre contexte, nous le fixons à OUI
. Le facteur d'échelle, qui est un flotte
que nous définissons à 0.0 (une valeur qui garantit une échelle spécifique à l’appareil). Selon que l’appareil dispose ou non d’un écran Retina, le facteur d’échelle sera réglé sur 2.0 ou 1.0 respectivement. Je parlerai un peu plus du facteur d’échelle dans un instant, mais pour une discussion plus approfondie, je vous renvoie à la documentation officielle (plus précisément à la section "Points contre pixels" du Guide de dessin et d'impression pour iOS). Une fois que nous créons un contexte d’image de cette façon, il devient le contexte actuel. C’est important car dessiner avec UIKit, nous devons avoir un contexte de dessin actuel où tous les dessins implicites ont lieu. Nous allons maintenant définir une couleur de remplissage pour le contexte actuel et remplir un rectangle de la taille de tout le contexte.
Nous créons maintenant un UIBezierPath
exemple sous la forme d’un cercle, que nous dessinons avec un contour épais et remplissons avec une couleur différente. Ceci conclut la partie de dessin de notre création d'image.
imageNamed:
initialiseur de UIImage
. Il est important de noter ici que nous avons deux ensembles d'images rupestres: rock1.png, rock2.png,… et [email protected], [email protected], le dernier étant deux fois la résolution de l'ancien. Une des grandes caractéristiques de UIImage
est-ce à l'exécution le imageNamed:
méthode recherche automatiquement une image avec le suffixe @ 2x supposée être à double résolution sur un appareil Retina. Si un est disponible, il est utilisé! Si l'image avec le suffixe est absente ou si le périphérique n'est pas une rétine, l'image standard est utilisée. Notez que nous ne spécifions pas le suffixe de l'image dans l'initialiseur. L’utilisation d’images à simple et double résolution en conjonction avec l’échelle dépendante de l’appareil (à la suite du réglage échelle
à 0.0
) assure que la taille réelle des objets à l'écran sera la même. Naturellement, les images Retina seront plus nettes en raison de la densité de pixels supérieure. UIImage
méthode drawAtPoint:
dessine l'image de la roche choisie au point spécifié dans le contexte de l'image en cours.UIImage
objet du contenu du contexte de l'image en cours, en appelant UIGraphicsGetImageFromCurrentImageContext ()
. UIGraphicsEndImageContext ()
termine le contexte d'image actuel et nettoie la mémoire.image
propriété de notre UIImageView
et l'afficher à l'écran.Construire et exécuter. Le résultat devrait ressembler à ce qui suit, mais uniquement de manière aléatoire:
UIImage créé par dessin et compositionEn testant à la fois les appareils Retina et les appareils autres que Retina ou en changeant le type d’appareil dans le simulateur sous Matériel menu, vous pouvez vous assurer que les roches sont retournées avec un par rapport à l'autre. Encore une fois, je n’ai fait que cela afin que nous puissions facilement confirmer que le bon ensemble d’images serait sélectionné au moment de l’exécution. Normalement, vous n'avez aucune raison de faire cela.!
Pour récapituler - au risque de préciser le point - nous avons créé une nouvelle image (un UIImage
objet) en composant ensemble les images que nous avons déjà sur un dessin que nous avons dessiné.
Passons à la suite de la mise en œuvre!
Considérons la figure ci-dessous.
Une légende (à gauche), déconstruite pour montrer comment l'image peut être redimensionnée de manière judicieuse (à droite)L'image de gauche montre une légende ou "bulle"semblable à celui observé dans de nombreuses applications de messagerie. Évidemment, nous aimerions que la légende soit agrandie ou réduite en fonction de la quantité de texte qu'il contient. De plus, nous aimerions utiliser une seule image à partir de laquelle nous pouvons générer des légendes Si vous agrandissez la légende de manière uniforme dans toutes les directions, l’ensemble de l’image devient pixélisée ou floue, en fonction de l’algorithme de redimensionnement utilisé. Notez toutefois la manière dont l’image de légende a été conçue. Elle peut être agrandie sans perte. de qualité simplement en reproduisant (carrelage) pixels au fur et à mesure. Les formes d'angle ne peuvent pas être redimensionnées sans modifier la qualité de l'image, mais d'un autre côté, le centre est constitué d'un bloc de pixels de couleur uniforme pouvant être créés à n'importe quelle taille. Les côtés supérieur et inférieur peuvent être étirés horizontalement sans perte de qualité, et les côtés gauche et droit verticalement. Tout cela est montré dans l'image à droite.
Heureusement pour nous, UIImage
a deux méthodes pour créer des images redimensionnables de ce type. Celui que nous allons utiliser est resizableImageWithCapInsets:
. Ici le "inserts de casquette"représentent les dimensions des coins non étirables de l'image (en partant de la marge supérieure vers la gauche) et sont encapsulées dans un struct
de type UIEdgeInsets
composé de quatre flotte
s:
typedef struct float en haut, à gauche, en bas, à droite; UIEdgeInsets;
La figure ci-dessous devrait préciser ce que ces chiffres représentent:
Exploitons redimensionnable UIImage
s pour créer une classe simple qui nous permet d'insérer n'importe quelle quantité de texte dans une image redimensionnable!
Créer un NSObject
sous-classe appelée Remarque
et entrez le code suivant dans Note.h et Note.m respectivement.
#importation@interface Remarque: NSObject @property (nonatomic, en lecture seule) NSString * text; @property (nonatomic, en lecture seule) UIImageView * noteView; - (id) initWithText: (NSString *) text fontSize: (float) fontSize noteChrome: (UIImage *) img edgeInsets: (UIEdgeInsets) insets maximumWidth: (CGFloat) width topLeftCorner: coin (CGPoint); @fin
#import "Note.h" @implementation Note - (id) initWithText: (NSString *) text fontSize: (float) fontSize noteChrome: (UIImage *) img edgeInsets: (UIEdgeInsets) insets maximumWidth: (CGFloat) width topLeftCorner: (CGPoint ) corner if (self = [super init]) #define LARGE_NUMBER 10000 // un grand nombre (mais arbitraire) car nous ne voulons imposer aucune contrainte verticale à la taille de la note _text = [NSString stringWithString: text] ; CGSize computedSize = [text sizeWithFont: [UIFont systemFontOfSize: fontSize] constrainedToSize: CGSizeMake (width, LARGE_NUMBER) lineBreakMode: NSLineBreakByWordWrapping]; UILabel * textLabel = [[UILabel alloc] init]; textLabel.font = [UIFont systemFontOfSize: fontSize]; textLabel.text = self.text; textLabel.numberOfLines = 0; // nombre illimité de lignes textLabel.lineBreakMode = NSLineBreakByWordWrapping; textLabel.frame = CGRectMake (insets.left, insets.top, computedSize.width, computedSize.height); _noteView = [[[UIImageView alloc]] initWithFrame: CGRectMake (corner.x, corner.y, textLabel.bounds.size.width + insets.left + insets.right, textLabel.bounds.size.height + insets.top + insets.bottom )]; _noteView.image = [img resizableImageWithCapInsets: insets]; [_noteView addSubview: textLabel]; retourner soi-même; @fin
La méthode d'initialisation pour Remarque
, -initWithText: fontSize: noteChrome: edgeInsets: maximumWidth: topLeftCorner:
prend plusieurs paramètres, y compris la chaîne de texte à afficher, la taille de la police, la note "chrome" (qui est le redimensionnable UIImage
qui entourera le texte), ses insertions en majuscule, la largeur maximale que la vue de l'image de la note peut avoir et le coin supérieur gauche du cadre de la note.
Une fois initialisé, le Remarque
classe' noteVoir
propriété (de type UIImageView
) est l'élément d'interface utilisateur que nous afficherons à l'écran.
La mise en œuvre est assez simple. Nous exploitons une méthode très utile de la NSString
la catégorie de sur UIKit, sizeWithFont: constrainedToSize: lineBreakMode:
, qui calcule la taille qu’un bloc de texte occupera à l’écran, en fonction de certains paramètres. Une fois que nous avons fait cela, nous construisons une étiquette de texte (UILabel
) et le remplir avec le texte fourni. En prenant en compte les tailles d’encart et la taille de texte calculée, nous affectons à l’étiquette un cadre approprié et noteVoir
de image
assez grand (en utilisant le resizableImageWithCapInsets
méthode) de sorte que l'étiquette s'adapte confortablement au-dessus de la zone intérieure de l'image.
Dans la figure ci-dessous, l'image à gauche représente une note typique contenant quelques lignes de texte..
Utiliser la plus petite image possible pour construire une image redimensionnableNotez que l'intérieur n'a rien d'intéressant. Nous pouvons réellement "desserrer" l'image à son strict minimum (comme indiqué à droite) en supprimant tous les pixels de l'intérieur avec un logiciel de traitement d'images. En fait, dans la documentation, Apple recommande que, pour de meilleures performances, la zone intérieure soit en mosaïque 1 x 1 pixels. C’est ce que la petite image amusante à droite représente, et c’est celle que nous allons transmettre à notre Remarque
initialiseur. Assurez-vous qu’il a été ajouté à votre projet en tant que squeezednote.png quand tu as traîné le Images dossier de votre projet.
Dans ViewController.m
, entrer le #import "Note.h"
déclaration en haut. Commentez le précédent viewDidLoad:
formulaire et entrez les informations suivantes:
- (void) viewDidLoad [super viewDidLoad]; NSString * text1 = @ "Hi!"; NSString * text2 = @ "Je me taille en fonction de mon contenu!"; NSString * text3 = @ "Standard random text: Lorem ipsum dolor sit amet, consectetur elit adipisicing, écoutez-le et gardez-le en mémoire. Faites-vous une idée de l’exercice Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim mest laborum. "; UIImage * noteChrome = [UIImage imageNamed: @ "squeezednote"]; UIEdgeInsets edgeInsets = UIEdgeInsetsMake (37, 12, 12, 12); Note * note1 = [[Note alloc] initWithText: text1 fontSize: 25.0 noteChrome: noteChrome edgeInsets: edgeInsets maximumWidth: 300 topLeftCorner: CGPointMake (10, 10)]; Note * note2 = [[Note alloc] initWithText: text2 fontSize: 30.0 noteChrome: noteChrome edgeInsets: edgeInsets maximumWidth: 300 topLeftCorner: CGPointMake (200, 10)]; Note * note3 = [[Note alloc] initWithText: text3 fontSize: 16.0 noteChrome: noteChrome edgeInsets: edgeInsets maximumWidth: 300 topLeftCorner: CGPointMake (10, 200)]; [auto.view addSubview: note1.noteView]; [auto.view addSubview: note2.noteView]; [auto.view addSubview: note3.noteView];
Nous créons simplement Remarque
objets avec une quantité de texte différente. Construisez, exécutez et observez comment le "chrome" autour de la note est redimensionné pour accueillir le texte à l'intérieur de ses limites..
À des fins de comparaison, voici à quoi ressemblerait la sortie "squeezednote.png"ont été configurés comme" normaux " UIImage
instancié avec imageNamed:
et redimensionné également dans toutes les directions.
Certes, nous n'utiliserions pas réellement une image "minimale" comme "squeezednote" à moins d'utiliser des images redimensionnables. L'effet présenté dans la capture d'écran précédente est donc considérablement exagéré. Cependant, le problème de flou serait certainement là.
Vers la dernière partie du tutoriel!
Par image animée, j'entends en fait une séquence d'images 2D individuelles affichées successivement. Ceci est fondamentalement juste l'animation de sprite qui est utilisée dans la plupart des jeux 2D. UIImage
a une méthode d'initialisation animatedImageNamed: durée:
auquel vous passez une chaîne qui représente le préfixe de la séquence d'images à animer, donc si vos images sont nommées "robot1.png", "robot2.png",…, "robot60.png", vous passeriez simplement dans la chaîne "robot" à cette méthode. La durée de l'animation est également passée. C'est à peu près tout! Lorsque l'image est ajoutée à un UIImageView
, il anime en permanence à l'écran. Mettons en œuvre un exemple.
Commentez la version précédente de viewDidLoad:
et entrez la version suivante.
- (void) viewDidLoad [super viewDidLoad]; ivs = [tableau NSMutableArray]; img = [UIImage animatedImageNamed: @ "explosion" durée: 2.0]; UITapGestureRecognizer * tap = [[UITapGestureRecognizer alloc] initWithTarget: action autonome: @selector (explosion :)]; [auto.view addGestureRecognizer: tapez sur]; - (void) explosion: (UITapGestureRecognizer *) t CGPoint loc = [t locationInView: self.view]; for (UIImageView * v in ivs) if ([v pointInside: [v convertPoint: loc fromView: self.view] withEvent: nil]) ivs removeObject: v]; [v removeFromSuperview]; revenir; UIImageView * v = [[UIImageView alloc] initWithImage: img]; v.center = loc; [ivs addObject: v]; [auto.view addSubview: v];
Nous avons ajouté un ensemble d'images PNG à notre projet., explosion1.png à travers explosion81.png qui représentent une séquence animée d'une explosion de feu. Notre code est assez simple. Nous détectons un tapotement sur l'écran et plaçons une nouvelle animation d'explosion au point de tapotement ou, si une explosion se produit déjà à ce moment-là, nous la retirons. Notez que le code essentiel consiste simplement à créer une image animée via animatedImageNamed:
à laquelle on passe la ficelle @"explosion"
et une valeur flottante pour la durée.
Vous devez exécuter vous-même l'application sur le simulateur ou sur un appareil pour pouvoir profiter du spectacle pyrotechnique, mais voici une image qui capture une seule image de l'action, avec plusieurs explosions simultanées..
Explosions animéesCertes, si vous développiez un jeu d’action très animé, comme un jeu de tir ou un jeu de plateforme à défilement horizontal, UIImage
Le support des images animées semblerait bien primitif. Ils ne seraient pas votre approche privilégiée pour la mise en œuvre de l'animation. Ce n'est pas vraiment ce que le UIImage
est conçu pour, mais dans d’autres scénarios moins exigeants, c’est peut-être le bon billet! Comme l'animation est exécutée en continu jusqu'à ce que vous supprimiez l'image animée ou la vue d'image de l'interface, vous pouvez les arrêter après un intervalle de temps prescrit en envoyant un message différé avec - performSelector: withObject: afterDelay:
ou utiliser un NSTimer
.
Dans ce tutoriel, nous avons examiné certaines fonctionnalités utiles mais moins bien connues du UIImage
classe qui peut être utile. Je vous suggère de regarder le UIImage
Référence de classe certaines des fonctionnalités dont nous avons parlé dans ce tutoriel ont plus d’options. Par exemple, les images peuvent être composées en utilisant l’un des plusieurs options de fusion. Les images redimensionnables peuvent être configurées dans l'une des deux modes de redimensionnement, carrelage (qui est celui que nous avons utilisé implicitement) ou d'étirement. Même les images animées peuvent avoir des incrustations. Nous n'avons pas parlé du sous-jacent CGImage
type opaque qui UIImage
s'enroule autour. Vous devez traiter CGImage
s si vous programmez au Core Graphics niveau, qui est l’API C qui se situe un niveau en dessous de UIKit dans le framework iOS. Core Graphics est plus puissant que UIKit programmer avec, mais pas aussi facilement. Nous n'avons pas non plus parlé d'images créées à partir de données d'un Image de base objet, car cela aurait plus de sens dans un Image de base Didacticiel.
J'espère que vous avez trouvé ce tutoriel utile. Garder le codage!