{ radak.org }         just another (tech) blog

7Jan/100

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 &lt; 0) szifonImageView.center = CGPointMake(0.0, szifonImageView.center.y); if (szifonImageView.center.x &gt; 320) szifonImageView.center = CGPointMake(300.0, szifonImageView.center.y);
    if (szifonImageView.center.y &lt; 0) szifonImageView.center = CGPointMake(szifonImageView.center.x, 0.0); if (szifonImageView.center.y &gt; 480) szifonImageView.center = CGPointMake(szifonImageView.center.x, 460.0);
}
 
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}
 
- (void)viewDidUnload {
}
 
- (void)dealloc {
    [szifonImageView release];
    [super dealloc];
}
 
@end

Ha mindent jól csináltál, ilyen lesz az eredmény:

Comments (0) Trackbacks (0)

No comments yet.


Leave a comment


No trackbacks yet.