41
Sonntag, 3. September 2017 15:54 Seite 1

Sonntag, 3. September 2017 15:54 fileStoryboard Optische Darstellung von Seiten Verwendung von xib-Templates Controls und ihre Ereignisse Animierte Darstellung Interaktivit ät (ca

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Sonntag, 3. September 2017 15:54

Seite 1

0 Allgemeines

0.1 Kursinhalte

0.2 Mac-Installation

0.3 Links

1 C-Sharp-Themen

1.1 Zugriffsmodifizierer

1.2 Bedingter Operator

1.3 Eigenschaften/Properties

1.4 Referenzen

2 Einführung

3 Grundlagen+Controls

3.1 Constraints

3.2 Controls

3.3 nint und nfloat

4 Listen

4.1 Indizierte Listen

5 Dynamisch erzeugte Controls

6 Touch+Gesten

7 Systeminfos

8 Dateien

9 Datenbanken

10 Seiten

11 Lebenszyklus

11.1 Lebenszyklus von Seiten

11.2 Lebenszyklus von Apps

12 Graphiken

13 Kamera+Galerie

14 Webzugriffe

15 Sensoren

16 Kontakte

InhaltsverzeichnisMontag, 28. August 2017 10:29

Seite 2

KursinhalteFreitag, 25. August 201712:23

Einführung (ca. 3 Tage)

Einführung in die iPhone-App-Entwicklung Xamarin

und in die Simulator-Struktur eines Xamarin-Programms.

Die erste App Steuerung (Touch)

Layout und Design (ca. 4 Tage)

Controller und Views

Storyboard

Optische Darstellung von Seiten

Verwendung von xib-Templates

Controls und ihre Ereignisse

Animierte Darstellung

Interaktivität (ca. 3 Tage)

Touchevents und Gesten

Tastaturen

Zugriff auf Galerie und Kamera

Versenden von SMS und E-Mails

Einleiten von Telefonaten

Datenspeicherung (ca. 2 Tage)

Schreiben und Lesen von Dateien

Erstellung und Nutzung von SQLite-Datenbanken

Medien und Konnektivität (ca. 3 Tage)

Auslesen von Sensoren

Zugriff auf Kontakte

Audio- und Video-Wiedergabe

Zeichnen von Graphiken

Web-Requests

Sonntag, 3. September 2017 15:18

Seite 3

Einfach dieser Anleitung folgen:https://techsviewer.com/install-macos-sierra-virtualbox-windows/

Es muss ein Intel-Prozessor der i-Generation vorliegen (i3, i5, …) vorliegen!

Im Anschluss wird auf dem Mac Visual Studio für Mac installiert, der Xamarin mitbringt :-)

Mac-InstallationSonntag, 3. September 2017 15:20

Seite 4

Pseudo-Platzhalter-Text:http://www.loremipsum.de/

Platzhalter-Bilder:http://lorempixel.com/

Icons:https://www.iconfinder.com/

SQLite-Datenbank:http://sqlite.org

LinksSonntag, 3. September 2017 15:22

Seite 5

internal

Auf den Typ oder Member kann von jedem Code in der gleichen Assembly zugegriffen werden, jedoch nicht von Code in einer anderen Assembly.

public

Auf den Typ oder Member kann von jedem Code in der gleichen Assembly oder einer anderen Assembly, die darauf verweist, zugegriffen werden.

private

Auf den Typ oder Member kann nur von Code in der gleichen Klasse oder Struktur zugegriffen werden.

protected

Auf den Typ oder Member kann nur von Code in der gleichen Klasse oder Struktur oder in einer Klasse, die von dieser Klasse abgeleitet ist, zugegriffen werden.

Aus <https://docs.microsoft.com/de-de/dotnet/csharp/programming-guide/classes-and-structs/access-modifiers>

ZugriffsmodifiziererFreitag, 11. August 2017 09:06

Seite 6

ternärer Operator,•Fragezeichen-Doppelpunkt-Operator•

Auch

genannt.

Syntax:

var = (<Bedingung>) ? <true-Wert> : <false-Wert>;

Dieser Ausdruck lässt sich immer und grundsätzlich auch schreiben als

if (<Bedingung>)

var = <true-Wert>;

else

var = <false-Wert>;

Beide Ausdrücke machen exakt dasselbe.

Bedingter OperatorMittwoch, 16. August 2017 12:18

Seite 7

Dies ist eine Erfindung von Microsoft. Kurz gesagt: es wird eine Methode aufgerufen, die sich aber nach außen wie eine Variable verhält.

Der Zugriff auf eine private-Variable erfolgt hier mittels eines klassischen Getters und Setters:

private int variable;

public int getVariable () return variable;

public void setVariable(int v)

// beliebige Filterung moeglich

if (v > 100)

else variable = v + 200;

variable = v;

Dabei steht es frei, ob beide Methoden oder nur eine realisiert werden. Bei ausschließlichem Schreibzugriff reicht der Setter.

Microsoft hat dann als "Antwort" die Eigenschaften erfunden (in C++.NET gibt es auch das Schlüsselwort "property"). Eigenschaften machen exakt das gleiche wie Getter und Setter, sind nur so "verpackt", daß sie sich wie Variablen verhalten.

private int variable;

public int Variable get return variable;

set // beliebige Filterung moeglich if (value > 100) variable = value; else variable = value + 200;

Später erfolgt der Aufruf:

Variable = 13;

Dadurch, daß der Eigenschaft etwas zugewiesen wird, wir der get-Bereich aufgerufen und beim Auslesen (Anforderung einer Info) der set-Bereich:

Eigenschaften/PropertiesDonnerstag, 17. August 2017 09:00

Seite 8

Console.WriteLine (Variable);

Die set- und get-Bereiche werden als Accessoren bezeichnet, also get-Accessor und set-Accessor.

Es gibt Situationen, in denen die Accessoren minimal bleiben sollen:

public int Variable get return variable;

set variable = value;

Dies kann als

public int Variable get; set;

geschrieben werden.

Seite 9

ref

Variablen werden als Referenzen übergeben und können in der Methode geändert werden.Analog in C: & und *

Aufruf Methode

out

Variablen werden als Referenz übergeben, allerdings ist die Übergabe eine Einbahnstraße, d.h. Werte können nur aus der Methode herausgegeben werden. Auf diese Weise kann eine Methode mehrere Rückgabewerte haben.

Aufruf Methode

ReferenzenMittwoch, 9. August 2017 10:38

Seite 10

Xamarin PlattformDie Xamarin Plattform ist eine Sammlung von mehreren Komponenten. Mit den Komponenten Xamarin.iOS, Xamarin.Android und Xamarin.Mac wird es möglich, native Apps für iOS, Android, Mac und Windows in C# zu schreiben. Für die Entwicklung stehen zwei IDEs zur Verfügung, Visual Studio und Xamarin Studio.

Xamarin.FormsMit dieser Komponente hat der Entwickler die Möglichkeit, auch die UI plattformübergreifend mit nur einer Codebasis zu implementieren. Dabei stellt Xamarin.Forms ein gewisses Kontingent an UI-Elementen zur Verfügung, das auf allen mobilen Plattformen zur Verfügung stehen muss (z. B. eine TextView oder ein Button). Bei der Umsetzung zur nativen App werden diese Forms-Elemente dann in die eigentlichen UI-Elemente der jeweiligen Plattform übersetzt.

Aus <https://ccvossel.de/xamarin/>

Die Umstellung von "Generic" hat nichts mit der Kompilierung zu tun, sondern lediglich mit der Ansicht eines gewünschten Gerätes!

EinführungMontag, 7. August 2017 11:07

Seite 11

Design C#-Code

Seite 12

Constraints1.Storyboard (Design und XML)2.Referenzen (ref, out)3.Controls4.nint und nfloat5.

Grundlagen + ControlsMittwoch, 9. August 2017 09:32

Seite 13

Constraints

Standardgemäß werden beim Einfügen eines Controls die linke obere Ecke als (x, y)-Position und Breite und Höhe angegeben.Für das aktuell eingestellte Display ist das gut, aber für ein größeres oder kleineres Display nicht. Da würden Controls zu klein bzw. würden nicht vollständig abgebildet.

Hier helfen Constraints (Einschränkungen):Wir geben keine Breite an, sondern den Abstand zum rechten Bildschirmrand. Damit wäre dann die Breite flexibel.

ConstraintsMittwoch, 9. August 2017 10:33

Seite 14

jedes Control ist irgendwie von UIView abgeleitet•v.Hidden = true; // ist unsichtbar•das Präfix "UI" gilt für alle Apple-Controls•

Für alle Views

UIView

eigener Datentyp•die Basisklasse aller Controls•von Haus aus ein Container (kann andere Elemente aufnehmen)•kann beliebige Hintergrundfarbe annehmen•

UISlider

Ereignis: ValueChanged•Min, Max, Value•Min-Tint•Thumb-Tint•Max-Tint•Min- und Max-Graphik•

UISwitch

Ereignis: ValueChanged•Pendant zur CheckBox•On, !On•

UISegmentedControl

Ereignis: ValueChanged•Pendant zu RadioButton•SelectedIndex•

ControlsMittwoch, 9. August 2017 12:32

Seite 15

Ein 32-Bit-Prozessor hat 32 Beinchen für Daten (0 = 0 kein Strom, 1 = 1 Strom).Ein 64-Bit-Prozessor hat 64 Beinchen für Daten (0 = 0 kein Strom, 1 = 1 Strom).

Aus <http://www.amdtown.com/BO4VKGZP/>

Aus <http://www.amdtown.com/BO4VKGZP/>

Ein 32-Biter kann somit als größte Ganzzahl: 232 = 4.294.967.296Darauf entfällt jeweils die Hälfte auf die Zahlen < 0 und auf >= 0:231 = 2.147.483.648 … 2.147.483.647 = 231 - 1.

Ein 64-Biter kann somit als größte Ganzzahl: 264 = 18.446.744.073.709.551.616Darauf entfällt jeweils die Hälfte auf die Zahlen < 0 und auf >= 0:263 = 9.223.372.036.854.775.808 … 9.223.372.036.854.775.807 = 263 - 1.

Das ist üblicherweise der Unterschied zwischen int und long.long-Zahlen auf einem 32-Bit-Rechner müssen umständlich berechnet werden.

nint ist auf einem 32-Bit-Rechner automatisch eine 32-Bit-Zahl und auf einem 64-Bit-Rechner eine

64-Bit-Zahl. Es wird also automatisch das Maximum gewählt.

nfloat ist analog:float auf einem 32-Bit- und double auf einem 64-Bit-Rechner.

nint und nfloatMittwoch, 9. August 2017 14:19

Seite 16

Das Anzeigen von Elementen in einer TableView geschieht halbautomatisch ;-)

Die TableView bekommt ein Modell zugewiesen (Modell muss von "UITableViewSource" erben:

1.

Tabelle.Source = new Modell();

public class Modell : UITableViewSource

Es muss die Implementierung der Methoden "GetCell" und "RowsInSection" erfolgen. 2.GetCell liefert die Tabellenzelle und RowsInSection die Anzahl der anzuzeigenden Einträge.

Und hier beginnt der Automatismus: bei der Zuweisung des Modells wird direkt aus der RowsInSection-Methode die Anzahl der Elemente gelesen und danach wird genauso oft die GetCell aufgerufen, d.h. hinter den Kulissen läuft irgendwo eine Schleife ab.

Da wir hier nur die eine Section haben, liefern wir die Anzahl der Eintraege.

Beim Aufruf der GetCell-Methode wird der Index der imaginären Schleife benötigt. Da die Liste zeilenweise aufgebaut wird, benötigen wir also den "Zeilenindex". Dieser wird als Argument mitgeliefert:

public override UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath)

Die betrachtete Zeile ist in indexPath.Row.

Ausgaben in Konsole: Console.WriteLine (…)•Ansicht mit (auf dem Mac): Debug -> Open System Log …•

ListenFreitag, 11. August 2017 10:35

Seite 17

Im Unterrichtsbeispiel liegt eine Datenbasis in Foirm einer Liste von Strings vor:

OpelMercedesMaseratiMaybachBugattiBorgwardVolkswagenVauxhallAudiPorscheBMW

Der erste Schritt ist die Sortierung:

AudiBorgwardBugattiBMWMaseratiMaybachMercedesOpelPorscheVauxhallVolkswagen

Nun soll der Inhalt der Liste sektioniert werden, sodaß jeder vorkommende Anfangsbuchstabe eine Liste der entsprechenden Einträge hat:

A -> AudiB -> Borgward, Bugatti, BMWM -> Maserati, Maybach, MercedesO -> OpelP -> PorscheV -> Vauxhall, Volkswagen

Dictionary<String, List<String>> …

Daraus folgt folgende Struktur:

Section 0, Row 0: AudiSection 2, Row 1: Maybach…

Indizierte ListenFreitag, 11. August 2017 12:35

Seite 18

Frame

Für alle erzeugten Controls gilt: sie brauchen eine Position (x, y), eine Breite und eine Höhe. Dies geschieht mittels eines Frames, der durch ein CGRect dargestellt wird:

CGRect frame = new CGRect (x, y breite, hoehe);lbl.Frame = frame;

View

Der Standard-Hintergrund unseres Displays ist eine UIView, die per Default den Namen "View"

trägt. Eine UIView ist bekannterweise ein Container, der weitere Elemente aufnehmen kann. Somit auch andere Dinge, die ebenfalls UIView sind.View.Add (vw) oder View.AddSubview (vw);

UIFont

UIFont fnt = UIFont.FromName("Arial", 30);fnt = UIFont.ItalicSystemFontOfSize(27);

lbl.Font = fnt;

So wird der Font gesetzt und mit fnt = UIFont.ItalicSystemFontOfSize(27)kann er auf Italic (Schräg) gesetzt werden. Analog gibt es auch BoldSystemFontOfSize.Ebenfalls ist somit die Schriftgröße änderbar.

Entfernen

Die Methode, von einer View entfernt zu weden, bringt jede UIView selbst mit:lbl.RemoveFromSuperview();

Dynamisch erzeugte ControlsMontag, 14. August 2017 10:26

Seite 19

Touch+GestenSonntag, 3. September 2017 15:38

Seite 20

http://media2.giga.de/2013/02/retina-Apple-Cartoon-lustig.jpg

https://www.paintcodeapp.com/news/ultimate-guide-to-iphone-resolutions

RetinaMittwoch, 16. August 2017 10:55

Seite 21

UIDeviceBatteryState:

Charging: ist am Stron und wird geladen•Full: ist am Strom und voll geladen•Unknown: keine Informationen verfügbar•Unplugged: nicht am Strom und entlädt•

System-InfosDonnerstag, 31. August 2017 15:17

Seite 22

Jede App laeuft in einer sogenannten Sandbox. Dadurch kann eine App eineandere nicht beeinflussen. Daten koennen auch nicht gegenseitig gelesen werden.Um dies zu erreichen, legt das Betriebssystem (iOS) fest, wo welche App ihreDaten unterbringt. Das bedeutet, dass jede App ihr eigenes kleines Dateisystem besitzt.Dieses ist natuerlich per Pfad erreichbar. Der Pfad ist ueber "Environment.SpecialFolder" zu bestimmen. Der Standard fuer Dokumente allerArt ist "MyDocuments".Hier koennen wir schalten und walten wie wir wollen (mit Anlegen/Loeschen von Verzeichnissen und Dateien, usw.).

String documents = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);

Der komplette Dateiname besteht aus dem Namen selbst und dem Pfaddorthin. Viele Betriebsysteme haben verschiedene Pfad-Trennzeichen.Das Betriebbsystem kennt sein Trennzeichen am besten, also ueberlassenwir ihm das Einsetzen davon und nutzen eine Funktion.

String datei = Path.Combine(documents, DATEINAME);

DateienDonnerstag, 17. August 2017 11:31

Seite 23

LibraryDonnerstag, 17. August 2017 14:46

Seite 24

SQlite-Engine in Betriebssystem integriert•http://sqlite.org•Jede Datenbank ist eine eigene Datei!•

Jedes Projekt, das SQLite verwendet, muss einen Verweis zu den SQLite-Bibliotheken haben.Um SQLite-Datenbanken verwenden zu koennen, werden zwei

Rechtsklick auf "Verweise"1.Verweis hinzufuegen2.Assemblys -> Framework3."System.Data.Sqlite" und "System.Data" auswaehlen4."System.Data.Sqlite" wird dann als "Mono.Data.Sqlite" aufgelistet.5.

Bibliotheken benoetigt, die wir anbinden muessen:

DatenbankenFreitag, 18. August 2017 10:53

Seite 25

Zu jedem auszuführenden Befehl wird ein Kommando benötigt (SqliteCommand).Dies wird von der geöffneten Connection geliefert.

Seite 26

eine mehrseitige App ist ein NavigationController zwingend notwendig!!!

Nun sind ein NavigationController und zwei ViewController vorhanden. Wir haben aber schon unseren ViewController, sodass der neue -- mitgelieferte -- nicht gebraucht wird und weichen muss. Dazu: so oft Rechtsklick und "Delete" wählen, bis er weg ist.

SeitenMontag, 21. August 2017 09:59

Seite 27

Unser alter ViewController muss jetzt der neue "Root ViewController" werden.Dazu einfach vom NavigationController zum ViewController mit der gedrückten Controltaste zum ViewController "draggen".

Seite 28

Seite 29

Es ist nun ein Verbindungspfeil aufgetaucht, der die Abhängigkeit zwischen den Controllern zeigt. Es ist nun ebenfalls eine NavigationBar mit einer Titelleiste vorhanden.Jetzt muss nur noch der NavigationController das Startelement sein, d.h. der kleine Pfeil mit dem Fähnchen muss auf den NavigationController zeigen.

Seite 30

Jetzt ist der korrekte Stand erreicht: der NavigationController MUSS der erste Controller sein, den das System "sieht". Er ist nun verantwortlich für sämtliche Seitenwechsel innerhalb unserer App.

Seite 31

Lebenszyklus von SeitenLebenszyklus von Apps

LebenszyklusSonntag, 3. September 2017 15:50

Seite 32

Lebenszyklus von Seiten

ViewWillAppear Diese Methode ist die letzte Methode, bevor diese Seite aktiv wird.

ViewDidAppear Diese Methode ist die erste Methode, nachdem diese Seite aktiv wurde.

ViewWillDisappear Diese Methode ist die letzte Methode, bevor diese Seite inaktiv wird.

ViewDidDisappear Diese Methode ist die erste Methode, nachdem diese Seite inaktiv wurde.

ViewDidLoad Wird vor der Methode "ViewWillAppear" aufgerufen und nur einmal pro Instanz.

Lebenszyklus von SeitenDienstag, 22. August 2017 10:48

Seite 33

Ebenfalls können Vorgänge bei App-Zustandsänderungen ausgeführt werden. Dazu gibt es spezielle Methoden, die nur für Apps da sind und die befinden sich in der Datei AppDelegate.cs.

FinishedLaunching Start ist vollzogen

OnResignActivation App wird inaktiv

DidEnterBackground App arbeitet im Hintergrund

WillEnterForeground App kommt in den Vordergrund

OnActivated App ist aktiv

WillTerminate App wird beendet

Lebenszyklus von AppsDonnerstag, 31. August 2017 14:46

Seite 34

Das Zeichnen von Graphiken funktioniert auf allen Views, die von UIView abgeleitet sind. Deshalb wird hier eine Klasse erzeugt, die von UIView erbt.

Liniengraphiken1.Flächengraphiken Keine Fachausdrücke :-D2.

Es wird zwischen zwei Graphikarten unterschieden:

Liniengraphiken werden mittels CGPath gezeichnet. Es sind Linienpfade.

Das Instanziieren einer von UIView abgeleiteten Klasse führt zum Aufruf der Methode Draw,die darum natürlich überschrieben sein muss.

Flächengraphiken können auch als Pfad gezeichnet werden. Es muss nur beim Malendie g.DrawPath(CGPathDrawingMode.Fill);gesetzt werden.

GraphikenFreitag, 25. August 2017 10:57

Seite 35

Der Unterschied zwischen einer Polyline und einem Polygon liegt darin, dass das Polygon immer geschlossen ist, d.h. der letzte Punkt ist mit dem ersten Punkt verbunden! Dies wird im Path mit der Methode ClosePath() erreicht.

Beim Kreisbogen sind die Winkelangaben des Eiunheitskreises zu beachten (0° liegt auf der "Drei-Uhr-Position").

Seite 36

1

1

sin α

cos α

α0°

90°

180°

270°

EinheitskreisFreitag, 25. August 2017 12:03

Seite 37

<key>NSPhotoLibraryUsageDescription</key> <string>Diese App benötigt Zugriff auf Fotos.</string>

Info.plistFreitag, 25. August 2017 14:32

Seite 38

https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html

Übersicht über die Zusatzinformationen, die mittels webClient.ResponseHeaders[…]);

abgerufen werden können.

WebzugriffeDonnerstag, 31. August 2017 15:19

Seite 39

Bei Sensoren und anderen Requests liefert das System ein Popup, ob der Zugriff erlaubt werden soll. Dazu gibt es bestimmte Keys, denen ein String zugewiesen wird, der dann angezeigt werden soll. Diese Keys sind die sogenannten Cocoa-Keys: https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW27

Eintrag in Info.plist:<key>NSLocationAlwaysUsageDescription</key><string>Darf der Standort ermittelt werden?</string>

SensorenMontag, 28. August 2017 11:03

Seite 40

KontakteSonntag, 3. September 2017 15:39

Seite 41