#import "Fraction.h" #import <stdio.h> @implementation Fraction -(Fraction*) initwithnumerator: (int) n denominator: (int) d { self = [super init]; } if ( self ) { [self setnumerator: n anddenominator: d]; } return self; -(void) print { printf( "%i/%i", numerator, denominator ); } -(void) setnumerator: (int) n { numerator = n; } -(void) setdenominator: (int) d { denominator = d; } -(void) setnumerator: (int) n anddenominator: (int) d { numerator = n; denominator = d; Programowanie dla iphone Storyboarding i własne elementy interfejsu użytkownika Programowanie aplikacji mobilnych na urządzenia Apple (IOS i ObjectiveC) Wykład 4
Storyboarding Nawigacja i ekrany aplikacji powinny być określone na początku Każdy widok powinien być samowystarczalny. Przejścia (segue) zdefiniowane pomiędzy kolejnymi widokami. 2
Storyboarding 3
Kolejne kroki tworzenia aplikacji 1) Tworzymy Sceny ViewControllers 2) Tworzymy Przejścia Segues (z identyfikatorami) 3) Programujemy wywołanie przejść. 4
Przejścia Przekazywanie danych między scenami. 5
Przesyłanie danych z powrotem Wykorzystanie delegata Host + delegat SourceViewController = delegat DestinationViewController = host 6
Delegat Delegat rejestruje się w hoście jako delegat. Jego metody będą odpowiednio wywołane. 7
Host Musi mieć właściwość (będącą delegatem) weak! 8
Protocol Delegat musi implementować protokół 9
Host Musi wywołać metodę delegata Na przykład w momencie zapisywania dodawanej książki. 10
Delegat Zamyka okna modalne 11
Kontrolki UI Navigation Bar Toolbar Tab Bar Image View Map View Table View Buttons Alerts 12
Kontrolki UI Text Field Search Bar Scope Bar Segmented Control RefreshControll Slider Stepper Switch 13
Przykładowa hierarchia klas dla obiektu UIButton Przykładowa ścieżka dziedziczenia elementów interfejsu użytkownika 14
UIView jako podstawa kontrolek Podstawa wszystkich kontrolek Cegiełki, z których buduje się kompletną scenę 15
Właściwości UIView Frame rozmiar i pozycja Bounds rozmiar Center pozycja w stosunku do nadwidoku Transform skalowanie, obrazcanie, 2d Alpha widoczność backgroundcolor kolor tłą contentstretch zmiana trybu, w jakim treść dopasowana jest do kontenera 16
Koordynaty UIView [0;0] górny lewy róg. Reprezentowane jako typ float Rozdzielczość dla programisty: Taka jak ekranu w przypadku zwykłych ekranów Dwukrotnie mniejsza niż w ekranach retina 17
Wymiary ekranów Urządzenie Punkty Piksele iphone<=3s 320x480 320x480 iphone4 / 4S 320x480 640x960 iphone 5 320x568 640x1136 ipad<=2 1024x768 1024x768 ipad mini 1024x768 1024x768 ipad>3 1024x768 2048x1536 ipodtouch 320x480 320x480 ipodtouchretina 320x480 640x960 Nowy ipodtouch 320x568 640x1136 18
UIView zarządzanie widokiem i podwidokami Widok może mieć >=0 podwidoków Każdy widok definiuje własne zasady skalowania i pozycjonowanie w zależności od widoku nadrzędnego Widok może modyfikować położenie i rozmiary swoich podwidoków 19
UIView zdarzenia akcji Widok jest narzędziem, które może obsługiwać zdarzenia dotyku zdefiniowane w klasie UIResponder Widok może używać obiektów typu GestureRecognizer do tego 20
Widoki Widoki mogą być zagnieżdżone Relacja rodzic dziecko Dziecko subview Rodzic superview Każdy rodzic może mieć dużo dzieci Dziecko ma jednego rodzica. 21
Geometria widoków Geometria widoków jest zdefiniowana przez Frame - położenie i rozmiar względem widoku rodzica Bounds zmiana wewnętrznych rozmiarów widoku To co jest poza zewnętrznym rozmiarem widoku może być przycięte albo nie. Center ustawienie pozycji bez zmiany rozmiaru 22
Tworzenie widoku Programistycznie Trzeba najpierw ustalić rozmiary (CGRect) CGRect viewrect = CGRectMake(10, 10, 100, 100); UIView* myview = [[UIView alloc] initwithframe:viewrect]; 23
Rysowanie widoku Rysowanie widoku odbywa się kiedy potrzeba Jeśli chcemy sami obsługiwać rysowanie, możemy zaimplementować metodę drawrect: 24
Tworzenie podklas UIView Kiedy sam widok nie zapewnia wszystkich potrzebnych funkcjonalności Może wystarczy rozszerzyć klasę? 25
Metody inicjalizacyjne podklasy UIView initwithframe: rekomendowana stworzenie widoku i uzupełnienie podstawowymi elementami initwithcoder: Zaimplementuj, jeśli pobierasz widok z interface builder layerclass - Implementuj w przypadku gdy używasz zaawansowanych narzędzi rysowania na przykład OpenGL 26
Metody rysowania podklasy UIView drawrect: - Jeśli chcemy rysować własne treści drawrect:forviewprintformatter: - Jeśli chcemy zmienić wygląd elementu podczas jego drukowania 27
Metody wyglądu podklasy UIView sizethatfits: - Jeśli chcesz zapobiec standardowym zmianom rozmiaru tego widoku layoutsubviews - Jeśli chcesz szczegółowo zarządzać ułożeniem podwidoków didaddsubview:, willremovesubview: - Żeby śledzić dodawanie i usuwanie podwidoków willmovetosuperview:, didmovetosuperview - Żeby śledzić ruchy widoku w jego hierarchii willmovetowindow:, didmovetowindow - Żeby śledzic ruchy widoku w innym oknie 28
Alternatywy dla podklas Wiele zachowań można osiągnąć ustawiając szczegółowe parametry widoku addconstraint autoresizingmask contentmode contentstretch backgroundcolor 29
Inicjalizowanie widoku initwithframe: Albo własna metoda inicjalizująca Ma zwracać typ (id) return self 30
UIView Runtime 31
Rady Nie każdy widok musi mieć własny ViewController Mininalizuj ilość samodzielnego rysowania Deklaruj widoki jako nieprzezroczyste zawsze gdy to możliwe 32
Gesture Recognizers Opakowują niskopoziomowe funkcje obsługi dotyku Pozwalają automatycznie wykryć typ dotyku Upraszczają procedurę 33
Uproszczenia Popularne gesty rozpoznane automatycznie. Odpowiednie obiekty służą do rozpoznawania konkretnych gestów Zmniejszają ilość potrzebnego kodu Zapewniają poprawność rozpoznania gestów 34
Wbudowane klasy GestureRecognizer Gesture Tapping (any number of taps) Pinching in and out (for zooming a view) Panning or dragging Swiping (in any direction) Rotating (fingers moving in opposite directions) Long press (also known as touch and hold ) UIKit class UITapGestureRecognizer UIPinchGestureRecognizer UIPanGestureRecognizer UISwipeGestureRecognizer UIRotationGestureRecognizer UILongPressGestureRecognize r 35
Zasady użycia Każdy jest związany z jednym widokiem Jeden widok może mieć wiele rozpoznawaczy Wiele różnych typów gestów Jeśli gesty mają być rozpoznawane, należy dołączyć obiekt gesture recognizer do widoku Gesture recognizer pierwszy (przed widokiem) otrzymuje informację o dotyku. 36
Gestures Trigger Action Messages Kiedy gesture recognizer rozpozna gest, przekazuje informację o tym do celu który ma określony Inicjalizacja obiektu gesturerecognizera wymaga określenia obsługiwanego celu. 37
Przykłady 38
Tworzenie obiektu GestureRecognizer Stworzenie instancji Przypisanie do celu Ustawienie konkretnych atrybutów Np. ilości potrzebnych uderzeń ekranu Przypisanie do widoku Zaimplementowanie akcji obsługi gestów 39
Przykład 40
Jak przebiega testowanie gestów 41
Jednoczesne rozpoznawanie gestów Domyślnie dwa rozpoznawacze nie mogą jednocześnie wykryć gestów Zdarzają się przypadki gdy to jest potrzebne (pinch & zoom) Zmiana domyślnego zachowania Implementacja metod UIGestureRecognizerDelegate gesturerecognizer:shouldrecognizesimultaneouslywithgesturer ecognizer: Metoda zwracająca YES pozwala na współpracę 42
Jednokierunkowa współpraca Implementacja 2 metod canpreventgesturerecognizer: canbepreventedbygesturerecognizer: Na przykład zabronienie wykrycia jednego gestu po wykryciu drugiego, ale umożliwienie wykrycia odwrotnej kolejności 43
Przykład 44
Własny GestureRecognizer Podklasa UIGestureRecognizer UIGestureRecognizerSubclass.h - (void)reset;- (void)touchesbegan:(nsset *)touches withevent:(uievent *)event; - (void)touchesmoved:(nsset *)touches withevent:(uievent *)event; - (void)touchesended:(nsset *)touches withevent:(uievent *)event; - (void)touchescancelled:(nsset *)touches withevent:(uievent *)event; 45
Porządek dotyku Dotyk jest w A > sprawdź B i C Dotyk jest w C > sprwdź D i E Dotyk jest w E wykonaj akcję 46
47
Multitouch Zdarza się, że chcemy reagować od razu na dowolny dotyk Rysowanie Szybka reakcja itp. Można samodzielnie obsługiwać dotyk Otrzymujemy informację o dotyku od razu po jego zaistnieniu 48
Interakcje z użytkownikiem userinteractionenabled: Metoda pozwalająca ustawić, czy dany widok ma interpretować, czy zignorować zdarzenia dotyku Implementacja metod pozwalających na pracę z dotykiem 49
Zdarzenie dotyku Faza: Began, - początek Moved, - poruszenie Ended, - zakończony Canceled. - anulowany W trakcie akcji dotyku odpowiednie metody dla tych faz są wykonywane 50
Praca z dotykiem widoku touchesbegan:withevent: touchesmoved:withevent: touchesended:withevent: touchescancelled:withevent: 51
Przykład podwójnego dotyku 52
Zakończenie KONIEC 53