iPhone segédlet 1: UIImageView, UIAccelerometer
(Ez a bejegyzésem megjelent a szifon.com-on is.)
Az AppStore-ban megjelent alkalmazásaim alapján összeírtam néhány hasznos kódrészletet, amelyek mindig jól jöhetnek a fejlesztések során. Ezek az írások nem tutoriálok, inkább nevezném őket segédletnek.
Kezdjük az iTinker-rel. Ez egy vízmérték, ami a beépített accelerometer-t használja és a visszakapott értékek alapján két UIImageView objektumot mozgat. A tetején van egy kis reklám csík, ahol a szöveget mozgatom. Amiről most szó lesz, az az Accelerometer használata, valamint az UIImageView létrehozása kódból és annak mozgatása.
A kódokhoz egy új View-based application template projectet hoztam létre szifon névvel. Az interface buildert ebben a leírásban nem használom, az objektumokat a példák során kódbol hozom létre.
Először is, hogy legyen mit mozgatnunk, létrehozunk egy kis zöld négyzetet a képernyő közepén. Én most a legegyszerűbb módon veszem fel az ehhez kellő UIImageView-t, természetesen lehet másképp is, sokkal szebben, de most nem ez a téma.
Szóval a szifonViewControllet.m -ben az implementation után vegyünk fel egy UIImageViewt:
szifonViewController.m:
@implementation szifonViewController UIImageView *szifonImageView; - (void)viewDidLoad {
És hogy ne felejtsük el később a memóriát felszabadítani, rögtön hívjuk is meg a release-t a dealloc-ban:
szifonViewController.m:
- (void)dealloc { [szifonImageView release]; [super dealloc]; }
Most már megvan minden ahhoz, hogy a kis négyzetünket megjelenítsük:
szifonViewController.m:
- (void)viewDidLoad { szifonImageView = [[UIImageView alloc] init]; // inicializáljuk az ImageView-nkat [szifonImageView setFrame:CGRectMake(150.0, 220.0, 20.0, 20.0)]; // képernyő közepére az x=150, y=220 pixelre kiteszünk egy 20x20-as négyzetet [szifonImageView setBackgroundColor:[UIColor greenColor]]; // beállítjuk a négyzet hátterét zöldre [self.view addSubview:szifonImageView]; // megjelenítjük az aktuális View-n }
Létrehoztuk a négyzetet, most kezdjük el mozgatni!
Az accelerometer használatához szükségünk van az UIAccelerometerDelegate-re, hogy az alkalmazásunk megkapja a készülék mozgatásakor az elmozdulás mértékét.
Ehhez a ViewController headerjében az interface definícióját módosítanunk kell az alábbiak szerint:
szifonViewController.h:
@interface szifonViewController : UIViewController { }
majd hozzá kell adnunk a delegálás elcsípéséhez a következőt:
szifonViewController.h:
- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration;
Be kell állítanunk az accelerometer delegálásának a tulajdonságait:
szifonViewController.m -ben a ViewDidLoad-ban a négyzet megjelenítése után szúrjuk be ezt a két sort:
[[UIAccelerometer sharedAccelerometer] setUpdateInterval:0.1]; // 100ms-enként jön az adat, hogy mi az elmozdulás értéke [[UIAccelerometer sharedAccelerometer] setDelegate:self]; // ezzel indítjuk a delegálást
Most már kapjuk az értékeket, már csak fel kell dolgoznunk azokat és mozgatni a négyzetünket.
szifonViewController.m:
- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration { // az x, y, z értékeket az accelereometer objektum tartalmazza // mi most csak az x és y-al foglalkozunk // Mivel az érték -1 és +1 között változik, az elmozdításhoz 20-as szorzót használtam, // ez azt jelenti, hogy legkisebb elmozdulás 2 pixel, a legnagyobb 20 pixel, attól függ, mennyire döntjük meg a készülékünket szifonImageView.center = CGPointMake(szifonImageView.center.x, szifonImageView.center.y - (acceleration.y * 20)); // az y elmozdulás alapján mozgatjuk a négyzetet szifonImageView.center = CGPointMake(szifonImageView.center.x + (acceleration.x * 20), szifonImageView.center.y); // az x elmozdulás alapján mozgatjuk a négyzetet // ez itt néhány ellenőrzés, hogy ne tudjon eltűnni a négyzetünk a kijelzőről; ha nagyon le akarna mászni, egyszerűen visszatesszük a szélére if (szifonImageView.center.x < 0) szifonImageView.center = CGPointMake(0.0, szifonImageView.center.y); if (szifonImageView.center.x > 320) szifonImageView.center = CGPointMake(300.0, szifonImageView.center.y); if (szifonImageView.center.y < 0) szifonImageView.center = CGPointMake(szifonImageView.center.x, 0.0); if (szifonImageView.center.y > 480) szifonImageView.center = CGPointMake(szifonImageView.center.x, 460.0); }
Ha mindnet jól csináltunk, a zöld négyzet a készülékünk mozgatásával mozogni fog a kijelzőn.
Összefoglalva a teljes kód:
szifonViewController.h:
1 2 3 4 5 6 7 8 | #import <UIKit/UIKit.h> @interface szifonViewController : UIViewController { } - (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration; @end |
szifonViewController.m:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | #import "szifonViewController.h" @implementation szifonViewController UIImageView *szifonImageView; - (void)viewDidLoad { szifonImageView = [[UIImageView alloc] init]; // inicializáljuk az ImageView-nkat [szifonImageView setFrame:CGRectMake(150.0, 220.0, 20.0, 20.0)]; // képernyő közepére az x=150, y=220 pixelre kiteszünk egy 20x20-as négyzetet [szifonImageView setBackgroundColor:[UIColor greenColor]]; // beállítjuk a négyzet hátterét zöldre [self.view addSubview:szifonImageView]; // megjelenítjük az aktuális View-n [[UIAccelerometer sharedAccelerometer] setUpdateInterval:0.1]; // 100ms-enként jön az adat, hogy mi az elmozdulás értéke [[UIAccelerometer sharedAccelerometer] setDelegate:self]; // ezzel indítjuk a delegálást [super viewDidLoad]; } - (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration { // az x, y, z értékeket az accelereometer objektum tartalmazza // mi most csak az x és y-al foglalkozunk // Mivel az érték -1 és +1 között változik, az elmozdításhoz 20-as szorzót használtam, // ez azt jelenti, hogy legkisebb elmozdulás 2 pixel, a legnagyobb 20 pixel, attól függ, mennyire döntjük meg a készülékünket szifonImageView.center = CGPointMake(szifonImageView.center.x, szifonImageView.center.y - (acceleration.y * 20)); // az y elmozdulás alapján mozgatjuk a négyzetet szifonImageView.center = CGPointMake(szifonImageView.center.x + (acceleration.x * 20), szifonImageView.center.y); // az x elmozdulás alapján mozgatjuk a négyzetet // ez itt néhány ellenőrzés, hogy ne tudjon eltűnni a négyzetünk a kijelzőről; ha nagyon le akarna mászni, egyszerűen visszatesszük a szélére if (szifonImageView.center.x < 0) szifonImageView.center = CGPointMake(0.0, szifonImageView.center.y); if (szifonImageView.center.x > 320) szifonImageView.center = CGPointMake(300.0, szifonImageView.center.y); if (szifonImageView.center.y < 0) szifonImageView.center = CGPointMake(szifonImageView.center.x, 0.0); if (szifonImageView.center.y > 480) szifonImageView.center = CGPointMake(szifonImageView.center.x, 460.0); } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; } - (void)viewDidUnload { } - (void)dealloc { [szifonImageView release]; [super dealloc]; } @end |
