Bilder in Xamarin.Mac
In diesem Artikel werden Bilder und Symbole in einer Xamarin.Mac-Anwendung behandelt. Es beschreibt das Erstellen und Verwalten der Bilder, die zum Erstellen des Symbols Ihrer Anwendung erforderlich sind, und die Verwendung von Bildern sowohl im C#-Code als auch im Xcode-Schnittstellen-Generator.
Überblick
Wenn Sie mit C# und .NET in einer Xamarin.Mac-Anwendung arbeiten, haben Sie Zugriff auf dieselben Bild- und Symboltools, die ein Entwickler in Objective-C und Xcode ausführt.
Es gibt verschiedene Möglichkeiten, wie Bildressourcen in einer macOS-Anwendung (früher als Mac OS X bezeichnet) verwendet werden. Von der einfachen Anzeige eines Bilds als Teil der Benutzeroberfläche Ihrer Anwendung zum Zuweisen eines Ui-Steuerelements wie einer Toolleiste oder eines Quelllistenelements zum Bereitstellen von Symbolen erleichtert Xamarin.Mac das Hinzufügen großartiger Grafiken zu Ihren macOS-Anwendungen auf folgende Weise:
- UI-Elemente – Bilder können als Hintergründe oder als Teil Ihrer Anwendung in einer Bildansicht
NSImageView
() angezeigt werden. - Schaltfläche – Bilder können in Schaltflächen (
NSButton
) angezeigt werden. - Bildzelle – Als Teil eines tabellenbasierten Steuerelements (
NSTableView
oderNSOutlineView
), bilder können in einer Bildzelle (NSImageCell
) verwendet werden. - Symbolleistenelement – Bilder können einer Symbolleiste () als Bildsymbolleistenelement (
NSToolbar
NSToolbarItem
) hinzugefügt werden. - Quelllistensymbol – Als Teil einer Quellliste (speziell formatiert
NSOutlineView
). - App-Symbol – Eine Reihe von Bildern kann in einer
.icns
Gruppe gruppiert und als Symbol Ihrer Anwendung verwendet werden. Weitere Informationen finden Sie in unserer Anwendungssymboldokumentation .
Darüber hinaus stellt macOS eine Reihe vordefinierter Bilder bereit, die in der gesamten Anwendung verwendet werden können.
In diesem Artikel werden die Grundlagen der Arbeit mit Bildern und Symbolen in einer Xamarin.Mac-Anwendung behandelt. Es wird dringend empfohlen, zuerst den Artikel "Hello, Mac " zu durchlaufen, insbesondere die Abschnitte "Einführung in Xcode" und "Interface Builder" und"Outlets" und "Actions ", da es sich um wichtige Konzepte und Techniken handelt, die wir in diesem Artikel verwenden werden.
Hinzufügen von Bildern zu einem Xamarin.Mac-Projekt
Wenn Sie ein Bild für die Verwendung in einer Xamarin.Mac-Anwendung hinzufügen, gibt es mehrere Orte und Möglichkeiten, wie der Entwickler Bilddatei in die Quelle des Projekts einschließen kann:
- Hauptprojektstruktur [veraltet] – Bilder können direkt zur Projektstruktur hinzugefügt werden. Beim Aufrufen von Bildern, die in der Hauptprojektstruktur aus Code gespeichert sind, wird kein Ordnerspeicherort angegeben. Beispiel:
NSImage image = NSImage.ImageNamed("tags.png");
. - Ressourcenordner [veraltet] – Der spezielle Ressourcenordner gilt für jede Datei, die Teil des Anwendungspakets wird, z. B. Symbol, Startbildschirm oder allgemeine Bilder (oder ein anderes Bild oder eine andere Datei, die der Entwickler hinzufügen möchte). Wenn Bilder aufgerufen werden, die im Ordner "Ressourcen " aus Code gespeichert sind, genau wie Bilder, die in der Hauptprojektstruktur gespeichert sind, wird kein Ordnerspeicherort angegeben. Beispiel:
NSImage.ImageNamed("tags.png")
. - Benutzerdefinierter Ordner oder Unterordner [veraltet] – Der Entwickler kann dem Quellbaum der Projekte einen benutzerdefinierten Ordner hinzufügen und die Bilder dort speichern. Der Speicherort, an dem die Datei hinzugefügt wird, kann in einem Unterordner geschachtelt werden, um das Projekt weiter zu organisieren. Wenn der Entwickler beispielsweise dem Projekt und einem Unterordner
Hearts
dieses Ordners einenCard
Ordner hinzugefügt hat, wird ein Bild Jack.png imHearts
Ordner gespeichert,NSImage.ImageNamed("Card/Hearts/Jack.png")
das Bild zur Laufzeit geladen. - Asset Catalog Image Sets [preferred] – Hinzugefügt in OS X El Capitan, Asset Catalogs Image Sets enthalten alle Versionen oder Darstellungen eines Bilds, die erforderlich sind, um verschiedene Geräte und Skalierungsfaktoren für Ihre Anwendung zu unterstützen. Anstatt sich auf den Dateinamen der Bildressourcen (@1x, @2x) zu verlassen.
Hinzufügen von Bildern zu einem Objektkatalogbildsatz
Wie oben erwähnt, enthält ein Objektkatalog image Sets alle Versionen oder Darstellungen eines Bilds, die erforderlich sind, um verschiedene Geräte und Skalierungsfaktoren für Ihre Anwendung zu unterstützen. Anstatt auf den Dateinamen der Bildressourcen zu vertrauen (siehe oben die Auflösung unabhängige Bilder und Bildklatur), verwenden Bildsätze den Objekt-Editor, um anzugeben, welches Bild zu welchem Gerät und/oder welcher Auflösung gehört.
Doppelklicken Sie im Lösungspad auf die Datei "Assets.xcassets" , um sie zum Bearbeiten zu öffnen:
Klicken Sie mit der rechten Maustaste auf die Ressourcenliste , und wählen Sie "Neues Bildsatz" aus:
Wählen Sie den neuen Bildsatz aus, und der Editor wird angezeigt:
Von hier aus können wir Bilder für jede der verschiedenen Geräte und Auflösungen ziehen.
Doppelklicken Sie auf den Namen des neuen Bildsatzes in der Ressourcenliste , um ihn zu bearbeiten:
Eine spezielle Vector-Klasse , die zu Image Sets hinzugefügt wurde, die es uns ermöglicht, ein PDF-formatiertes Vektorbild in das Casset einzuschließen, anstatt einzelne Bitmapdateien in den verschiedenen Auflösungen einzuschließen. Mit dieser Methode geben Sie eine einzelne Vektordatei für die @1x Auflösung (formatiert als Vektor-PDF-Datei) und die @2x und @3x Versionen der Datei zur Kompilierungszeit generiert und in das Paket der Anwendung eingeschlossen werden.
Wenn Sie z. B. eine MonkeyIcon.pdf
Datei als Vektor eines Objektkatalogs mit einer Auflösung von 150px x 150px einschließen, würden die folgenden Bitmapressourcen beim Kompilieren in das endgültige App-Bundle aufgenommen:
- MonkeyIcon@1x.png - 150px x 150px Auflösung.
- MonkeyIcon@2x.png - 300px x 300px Auflösung.
- MonkeyIcon@3x.png - 450px x 450px Auflösung.
Im Folgenden sollten Sie berücksichtigen, wenn Sie PDF-Vektorbilder in Objektkatalogen verwenden:
- Dies ist keine vollständige Vektorunterstützung, da die PDF-Datei zur Kompilierungszeit auf eine Bitmap gerastert wird und die in der endgültigen Anwendung gelieferten Bitmaps.
- Sie können die Größe des Bilds nicht anpassen, nachdem sie im Objektkatalog festgelegt wurde. Wenn Sie versuchen, die Größe des Bilds (entweder im Code oder mithilfe von Autolayout- und Größenklassen) zu ändern, wird das Bild wie jede andere Bitmap verzerrt.
Wenn Sie einen Bildsatz im Schnittstellen-Generator von Xcode verwenden, können Sie einfach den Namen des Satzes aus der Dropdownliste im Attributinspektor auswählen:
Hinzufügen neuer Ressourcensammlungen
Wenn Sie mit Bildern in Ressourcenkatalogen arbeiten, kann es vorkommen, dass Sie eine neue Auflistung erstellen möchten, anstatt alle Bilder zur Assets.xcassets-Auflistung hinzuzufügen. Beispielsweise beim Entwerfen von On-Demand-Ressourcen.
So fügen Sie Ihrem Projekt einen neuen Ressourcenkatalog hinzu:
Klicken Sie mit der rechten Maustaste auf das Projekt im Projektmappenblock, und wählen Sie "AddNew Datei">aus...
Wählen Sie "MacAsset-Katalog>" aus, geben Sie einen Namen für die Sammlung ein, und klicken Sie auf die Schaltfläche "Neu":
Von hier aus können Sie mit der Auflistung auf die gleiche Weise arbeiten wie die standardmäßige Assets.xcassets-Auflistung , die automatisch im Projekt enthalten ist.
Hinzufügen von Bildern zu Ressourcen
Wichtig
Diese Methode zum Arbeiten mit Bildern in einer macOS-App wurde von Apple veraltet. Sie sollten stattdessen Objektkatalogbildsätze verwenden, um die Bilder Ihrer App zu verwalten.
Bevor Sie eine Bilddatei in Ihrer Xamarin.Mac-Anwendung (entweder im C#-Code oder im Schnittstellen-Generator) verwenden können, muss sie im Ressourcenordner des Projekts als Bundleressource enthalten sein. Gehen Sie wie folgt vor, um einer Projekt eine Datei hinzuzufügen:
Klicken Sie mit der rechten Maustaste auf den Ordner "Ressourcen" in Ihrem Projekt im Lösungspad, und wählen Sie "AddAdd-Dateien>" aus...:
Wählen Sie im Dialogfeld "Dateien hinzufügen " die Bilderdateien aus, die zum Projekt hinzugefügt werden sollen, wählen Sie
BundleResource
für die Buildaktion außer Kraft, und klicken Sie auf die Schaltfläche " Öffnen ":Wenn sich die Dateien noch nicht im Ordner "Ressourcen " befinden, werden Sie gefragt, ob Sie die Dateien kopieren, verschieben oder verknüpfen möchten. Wählen Sie aus, welche ihre Anforderungen erfüllen, in der Regel kopieren:
Die neuen Dateien werden in das Projekt aufgenommen und zur Verwendung gelesen:
Wiederholen Sie den Vorgang für alle erforderlichen Bilddateien.
Sie können eine beliebige PNG-, JPG- oder PDF-Datei als Quellbild in Ihrer Xamarin.Mac-Anwendung verwenden. Im nächsten Abschnitt sehen wir uns das Hinzufügen von High-Resolution-Versionen unserer Bilder und Symbole zur Unterstützung von Retina-basierten Macs an.
Wichtig
Wenn Sie "Images" zum Ordner "Ressourcen " hinzufügen, können Sie die Buildaktion außer Kraft setzen, die auf "Standard" festgelegt ist. Die Standard-Buildaktion für diesen Ordner ist BundleResource
.
Bereitstellen von hochauflösenden Versionen aller App-Grafikressourcen
Alle Grafikressourcen, die Sie einer Xamarin.Mac-Anwendung (Symbole, benutzerdefinierte Steuerelemente, benutzerdefinierte Cursor, benutzerdefinierte Grafiken usw.) hinzufügen, müssen zusätzlich zu ihren Standardauflösungsversionen über hochauflösende Versionen verfügen. Dies ist erforderlich, damit Ihre Anwendung beim Ausführen auf einem auf einem Netzhautanzeige ausgestatteten Mac-Computer am besten aussieht.
Übernehmen der @2x Benennungskonvention
Wichtig
Diese Methode zum Arbeiten mit Bildern in einer macOS-App wurde von Apple veraltet. Sie sollten stattdessen Objektkatalogbildsätze verwenden, um die Bilder Ihrer App zu verwalten.
Wenn Sie die standard- und hochauflösenden Versionen eines Bilds erstellen, folgen Sie dieser Benennungskonvention für das Bildpaar, wenn sie in Ihr Xamarin.Mac-Projekt eingeschlossen werden:
- Standardauflösung - ImageName.filename-extension (Beispiel: tags.png)
- Hohe Auflösung - ImageName@2x.filename-extension (Beispiel: tags@2x.png)
Wenn sie einem Projekt hinzugefügt wurden, werden sie wie folgt angezeigt:
Wenn ein Bild einem UI-Element im Schnittstellen-Generator zugewiesen wird, wählen Sie einfach die Datei im ImageNameaus.filename-extension format (Beispiel: tags.png). Dasselbe für die Verwendung eines Bilds im C#-Code, wählen Sie die Datei im ImageNameaus.filename-extension format.
Wenn Sie Xamarin.Mac-Anwendung auf einem Mac ausführen, wird der ImageNameangezeigt.Dateierweiterungsformatbild wird auf Standardauflösungsanzeigen verwendet, dasImageName@2x.filename Erweiterungsbild wird automatisch auf Retina Display-Basis macs ausgewählt.
Verwenden von Bildern im Schnittstellen-Generator
Jede Bildressource, die Sie dem Ordner "Ressourcen " in Ihrem Xamarin.Mac-Projekt hinzugefügt haben und die Buildaktion auf BundleResource festgelegt haben, wird automatisch im Interface Builder angezeigt und kann als Teil eines UI-Elements ausgewählt werden (wenn es Bilder behandelt).
Gehen Sie wie folgt vor, um ein Bild im Schnittstellen-Generator zu verwenden:
Hinzufügen eines Bilds zum Ordner "Ressourcen " mit einer Buildaktion von
BundleResource
:Doppelklicken Sie auf die Datei "Main.storyboard ", um sie zum Bearbeiten im Schnittstellen-Generator zu öffnen:
Ziehen Sie ein UI-Element, das Bilder auf der Entwurfsoberfläche verwendet (z. B. ein Bildsymbolleistenelement):
Wählen Sie das Bild aus, das Sie dem Ordner "Ressourcen " im Dropdown " Bildname " hinzugefügt haben:
Das ausgewählte Bild wird auf der Entwurfsoberfläche angezeigt:
Speichern Sie Ihre Änderungen, und kehren Sie zu Visual Studio für Mac zurück, um mit Xcode zu synchronisieren.
Die oben aufgeführten Schritte funktionieren für jedes UI-Element, mit dem ihre Bildeigenschaft im Attributinspektor festgelegt werden kann. Wenn Sie eine @2x Version Ihrer Bilddatei enthalten haben, wird sie automatisch auf Retina Display basierenden Macs verwendet.
Wichtig
Wenn das Bild in der Dropdownliste "Bildname" nicht verfügbar ist, schließen Sie Ihr .storyboard-Projekt in Xcode, und öffnen Sie sie von Visual Studio für Mac erneut. Wenn das Bild weiterhin nicht verfügbar ist, stellen Sie sicher, dass die BuildaktionBundleResource
vorhanden ist und das Bild dem Ordner "Ressourcen " hinzugefügt wurde.
Verwenden von Bildern im C#-Code
Beim Laden eines Bilds in den Arbeitsspeicher mithilfe von C#-Code in Ihrer Xamarin.Mac-Anwendung wird das Bild in einem NSImage
Objekt gespeichert. Wenn die Bilddatei im Xamarin.Mac-Anwendungspaket (in Ressourcen enthalten) enthalten ist, verwenden Sie den folgenden Code, um das Bild zu laden:
NSImage image = NSImage.ImageNamed("tags.png");
Der obige Code verwendet die statische ImageNamed("...")
Methode der NSImage
Klasse, um das angegebene Bild im Arbeitsspeicher aus dem Ordner "Ressourcen " zu laden, wenn das Bild nicht gefunden werden kann, null
wird zurückgegeben. Wenn Sie eine @2x Version Ihrer Bilddatei enthalten haben, wird sie automatisch auf Retina Display basierenden Macs verwendet.
Um Bilder außerhalb des Pakets der Anwendung (aus dem Mac-Dateisystem) zu laden, verwenden Sie den folgenden Code:
NSImage image = new NSImage("/Users/KMullins/Documents/photo.jpg")
Arbeiten mit Vorlagenbildern
Basierend auf dem Design Ihrer macOS-App kann es vorkommen, dass Sie ein Symbol oder Bild innerhalb der Benutzeroberfläche anpassen müssen, um einem Änderungsschema der Farbschemas zu entsprechen (z. B. basierend auf Benutzereinstellungen).
Um diesen Effekt zu erreichen, wechseln Sie zum Rendermodus Ihres Bildobjekts zu Vorlagenbild:
Weisen Sie vom Xcode-Schnittstellen-Generator das Image-Objekt einem UI-Steuerelement zu:
Oder optional die Bildquelle im Code festlegen:
MyIcon.Image = NSImage.ImageNamed ("MessageIcon");
Fügen Sie der Ansichtscontroller die folgende öffentliche Funktion hinzu:
public NSImage ImageTintedWithColor(NSImage sourceImage, NSColor tintColor)
=> NSImage.ImageWithSize(sourceImage.Size, false, rect => {
// Draw the original source image
sourceImage.DrawInRect(rect, CGRect.Empty, NSCompositingOperation.SourceOver, 1f);
// Apply tint
tintColor.Set();
NSGraphics.RectFill(rect, NSCompositingOperation.SourceAtop);
return true;
});
Wichtig
Besonders bei der Einführung des dunklen Modus in macOS Mojave ist es wichtig, die LockFocus
API beim Erneuten von benutzerdefinierten NSImage
Objekten zu vermeiden. Solche Bilder werden statisch und werden nicht automatisch aktualisiert, um darstellungs- oder Anzeigedichteänderungen zu berücksichtigen.
Durch die Verwendung des oben genannten Handlermechanismus erfolgt das erneute Rendern für dynamische Bedingungen automatisch, wenn dies NSImage
z. B. in einer NSImageView
.
Rufen Sie diese Funktion schließlich auf, um ein Vorlagenbild zu farbisieren:
MyIcon.Image = ImageTintedWithColor (MyIcon.Image, NSColor.Red);
Verwenden von Bildern mit Tabellenansichten
Um ein Bild als Teil der Zelle in eine NSTableView
Zelle einzuschließen, müssen Sie ändern, wie die Daten von der Methode "TabellenansichtGetViewForItem
NSTableViewDelegate's
" zurückgegeben werden, um eine NSTableCellView
anstelle des typischen NSTextField
Typs zu verwenden. Beispiel:
public override NSView GetViewForItem (NSTableView tableView, NSTableColumn tableColumn, nint row)
{
// This pattern allows you reuse existing views when they are no-longer in use.
// If the returned view is null, you instance up a new view
// If a non-null view is returned, you modify it enough to reflect the new data
NSTableCellView view = (NSTableCellView)tableView.MakeView (tableColumn.Title, this);
if (view == null) {
view = new NSTableCellView ();
if (tableColumn.Title == "Product") {
view.ImageView = new NSImageView (new CGRect (0, 0, 16, 16));
view.AddSubview (view.ImageView);
view.TextField = new NSTextField (new CGRect (20, 0, 400, 16));
} else {
view.TextField = new NSTextField (new CGRect (0, 0, 400, 16));
}
view.TextField.AutoresizingMask = NSViewResizingMask.WidthSizable;
view.AddSubview (view.TextField);
view.Identifier = tableColumn.Title;
view.TextField.BackgroundColor = NSColor.Clear;
view.TextField.Bordered = false;
view.TextField.Selectable = false;
view.TextField.Editable = true;
view.TextField.EditingEnded += (sender, e) => {
// Take action based on type
switch(view.Identifier) {
case "Product":
DataSource.Products [(int)view.TextField.Tag].Title = view.TextField.StringValue;
break;
case "Details":
DataSource.Products [(int)view.TextField.Tag].Description = view.TextField.StringValue;
break;
}
};
}
// Tag view
view.TextField.Tag = row;
// Setup view based on the column selected
switch (tableColumn.Title) {
case "Product":
view.ImageView.Image = NSImage.ImageNamed ("tags.png");
view.TextField.StringValue = DataSource.Products [(int)row].Title;
break;
case "Details":
view.TextField.StringValue = DataSource.Products [(int)row].Description;
break;
}
return view;
}
Hier gibt es einige Interessenlinien. Zunächst erstellen wir für Spalten, die ein Bild einschließen möchten, eine Neue NSImageView
der erforderlichen Größe und Position, wir erstellen auch eine neue NSTextField
und platzieren ihre Standardposition basierend darauf, ob wir ein Bild verwenden:
if (tableColumn.Title == "Product") {
view.ImageView = new NSImageView (new CGRect (0, 0, 16, 16));
view.AddSubview (view.ImageView);
view.TextField = new NSTextField (new CGRect (20, 0, 400, 16));
} else {
view.TextField = new NSTextField (new CGRect (0, 0, 400, 16));
}
Zweitens müssen wir die neue Bildansicht und das Textfeld in das übergeordnete NSTableCellView
Feld einschließen:
view.AddSubview (view.ImageView);
...
view.AddSubview (view.TextField);
...
Schließlich müssen wir dem Textfeld mitteilen, dass es mit der Zelle "Tabellenansicht" verkleinern und wachsen kann:
view.TextField.AutoresizingMask = NSViewResizingMask.WidthSizable;
Beispielausgabe:
Weitere Informationen zur Arbeit mit Tabellenansichten finden Sie in der Dokumentation zu Tabellenansichten .
Verwenden von Bildern mit Gliederungsansichten
Um ein Bild als Teil der Zelle in eine NSOutlineView
Zelle einzuschließen, müssen Sie ändern, wie die Daten von der Gliederungsansicht-Methode NSTableViewDelegate's
GetView
zurückgegeben werden, um anstelle NSTableCellView
der typischen NSTextField
. Beispiel:
public override NSView GetView (NSOutlineView outlineView, NSTableColumn tableColumn, NSObject item) {
// Cast item
var product = item as Product;
// This pattern allows you reuse existing views when they are no-longer in use.
// If the returned view is null, you instance up a new view
// If a non-null view is returned, you modify it enough to reflect the new data
NSTableCellView view = (NSTableCellView)outlineView.MakeView (tableColumn.Title, this);
if (view == null) {
view = new NSTableCellView ();
if (tableColumn.Title == "Product") {
view.ImageView = new NSImageView (new CGRect (0, 0, 16, 16));
view.AddSubview (view.ImageView);
view.TextField = new NSTextField (new CGRect (20, 0, 400, 16));
} else {
view.TextField = new NSTextField (new CGRect (0, 0, 400, 16));
}
view.TextField.AutoresizingMask = NSViewResizingMask.WidthSizable;
view.AddSubview (view.TextField);
view.Identifier = tableColumn.Title;
view.TextField.BackgroundColor = NSColor.Clear;
view.TextField.Bordered = false;
view.TextField.Selectable = false;
view.TextField.Editable = !product.IsProductGroup;
}
// Tag view
view.TextField.Tag = outlineView.RowForItem (item);
// Allow for edit
view.TextField.EditingEnded += (sender, e) => {
// Grab product
var prod = outlineView.ItemAtRow(view.Tag) as Product;
// Take action based on type
switch(view.Identifier) {
case "Product":
prod.Title = view.TextField.StringValue;
break;
case "Details":
prod.Description = view.TextField.StringValue;
break;
}
};
// Setup view based on the column selected
switch (tableColumn.Title) {
case "Product":
view.ImageView.Image = NSImage.ImageNamed (product.IsProductGroup ? "tags.png" : "tag.png");
view.TextField.StringValue = product.Title;
break;
case "Details":
view.TextField.StringValue = product.Description;
break;
}
return view;
}
Hier gibt es einige Interessenlinien. Zunächst erstellen wir für Spalten, die ein Bild einschließen möchten, eine Neue NSImageView
der erforderlichen Größe und Position, wir erstellen auch eine neue NSTextField
und platzieren ihre Standardposition basierend darauf, ob wir ein Bild verwenden:
if (tableColumn.Title == "Product") {
view.ImageView = new NSImageView (new CGRect (0, 0, 16, 16));
view.AddSubview (view.ImageView);
view.TextField = new NSTextField (new CGRect (20, 0, 400, 16));
} else {
view.TextField = new NSTextField (new CGRect (0, 0, 400, 16));
}
Zweitens müssen wir die neue Bildansicht und das Textfeld in das übergeordnete NSTableCellView
Feld einschließen:
view.AddSubview (view.ImageView);
...
view.AddSubview (view.TextField);
...
Schließlich müssen wir dem Textfeld mitteilen, dass es mit der Zelle "Tabellenansicht" verkleinern und wachsen kann:
view.TextField.AutoresizingMask = NSViewResizingMask.WidthSizable;
Beispielausgabe:
Weitere Informationen zur Arbeit mit Gliederungsansichten finden Sie in der Dokumentation zu Gliederungsansichten .
Zusammenfassung
Dieser Artikel hat einen detaillierten Blick auf die Arbeit mit Bildern und Symbolen in einer Xamarin.Mac-Anwendung gemacht. Wir haben die verschiedenen Typen und Verwendungen von Bildern gesehen, wie Bilder und Symbole im Benutzeroberfläche-Generator von Xcode verwendet werden und wie Sie mit Bildern und Symbolen im C#-Code arbeiten.