Monday, January 18, 2010

UIView class-anak ellenorzese

Ha egy public class-rol van szo (pl UILabel) akkor konnyu megnezni:

if ([myView isKindOfClass:[UILabel class]]{

NSLog(@"myView is a UILabel");

}

de ha egy private class-ra akarom ellenorizni (pl MPFullScreenTransportControls) akkor az igy mar le sem fordulna. Ilyenkor ez is egy lehetseges megoldas:

NSString *className = NSStringFromClass([myView class]);

if (NSOrderedSame == [className compare:@"MPFullScreenTransportControls"]) {

//...

}

NSArray bejarasa "foreach"

for(id myArrayElement in myArray) {

//do something with myArrayElement

}


Friday, January 15, 2010

MPMoviePlayerController vezerlese - megoldas

Tovabbra is az a lenyeg, hogy MPMoviePlayerController-rel le tudjak jatszani egymas utan tobb movie-t es a "previous" "next" gombokkal tudjak valtogatni kozottuk valamint a Done gombra alljon le.

Volt tobb rosz megoldasom:
-megneztem, hogy MPMoviePlayerPlaybackDidFinishNotification-ben meg tudom-e allapitan miert lett vege, de erre a 3.1.2-ben nincs lehetoseg (ugyanugy kuldi a notification-t, ha vege van a movie-nak, vagy ha a megnyomta a user a done, "prev", "next" gombok valamelyiket)
-Probaltam atlatszo UIButton-okkal letakarni ezeket a gombokat es a sajat gombjaim megnyomasat lekezelni, de ez sem jo, mert a default controlok eltunnek/megjelennek es errol sincsen semmi ertesites.
-Felmerult, hogy csupa sajat UIView-val megcsinalni, ami egyreszt nem lett volna tul szep, masreszt a timeline es a volume control gondot okozott volna.

Vegul ezt a megoldast talaltam (ami egyreszt nem menne at valoszinuleg az app store-on, masreszt a kovetkezo SDK-val valtozhat is. 3.1.2-vel probaltam):

Tovabbra is felteszem az osszes controlt az MPMoviePlayerController-re (MPMovieControlModeDefault), majd igy ferek hozzajuk a UIWindowDidBecomeKeyNotification-ra feliratkozva. (Eloszor a MPMoviePlayerContentPreloadDidFinishNotification-t akartam hasznalni, de az nem volt jo. Elsore ezt nem is vettem eszre, mert az elso movie betoltesenel eloszor a keyWindow notificaton jott meg es utana a preloadDidFinish, viszont a masodik play-nel mar forditva.):

id internal;

object_getInstanceVariable(player, "_internal", (void *)&internal);

id videoViewController;

object_getInstanceVariable(internal, "_videoViewController", (void*)&videoViewController);

UIView *overlayView = [videoViewController _overlayView]; //MPFullScreenVideoOverlay


Ennek a UIView-nak pedig a subview-it siman le lehet kerni amik nagyjabol igy neznek ki. Azert nagyjabol, mert subviews egy NSArray-t ad vissza amiben az elemek sorrendje nem kotott. Azt figyeltem meg, hogy az MPFullScreenVideoOverlay-nek ha lekerem a subview-it akkor az mindig ugyanabban a sorrendben jott vissza /MPFullScreenTransportControls, NPCenteringNavigationBar/ es meg az MPFullScreenTransportControls subview-it lekerve is ugyanaz volt a sorrend /play, next, previous/, de az NPCenteringNavigationBar-nal az elso video betoltesenel UINavigationButton, UIView volt a sorrend, de a masodiknal mar pont forditva. Tehat ha subview-kat kerunk le egy NSArray-ba, akkor ne hagyatkozzunk a sorrendre, mert nem mi raktuk ossze!!!

Tehat ha igy a kezunkben van peldaul a "next" gomb, akkor arra ra is kothetjuk a sajat targetaction-unket a UIControlEventTouchUpInside-ra. Nem art elott lekotni rola a defult action-t:

[nextButton removeTarget:fstc action:nil forControlEvents:UIControlEventTouchUpInside];

[nextButton addTarget:self action:@selector(nextButtonClicked:) forControlEvents:UIControlEventTouchUpInside];


Aztan persze meg kell irni a sajat nextButtonClicked methodunkat is (meg a tobbi gombet is) amiben ha van meg lejatszando movie-nk akkor release-eljuk az MPMoviePlayerController-t majd csinalunk egy ujat a kovetkezo movie-val.>

Wednesday, January 6, 2010

MPMoviePlayerController "Previous" es "Next" button-jainak letakarasa.

Amig nem talalok megoldast ez elozo problemara, addig ugyanugy letakarom 1-1 UIButton View-val a "previous" es "next" (nem tudom mi a hivatalos nevuk) buttont, mint ahogy a Done buttonnal tettem, a minimalis CGRect pedig amivel le lehet takarni az a (36, 122, 63, 71) es a (36, 287, 63, 71) azaz a (36,122) es (99, 193) illetve a (36, 287) es (99, 358) kozotti terulet.
Igy nez ki, ha lathatova tesszuk:

UPDATE: Ez csak szimulatorban igaz, mert ott nem latszik a volume control. Az igazi device-on mashol van. Amugy sem az igazi megoldas ez, mert az overlay gombok akkor is ott lesznek, ha amugy a Default control-ok nem latszanak. Arra sajnos nincs lehetoseg, hogy megtudjuk eppen latszanak-e lejatszas kozben a default control-ok. Valoszinuleg az lesz a legjobb, ha az MPMovieControlModeHidden-re allitam es megcsinalom a sajat "Done", "Next", "Previous" controljaimat es esetleg meg egy mindig lathato controlt ami elrejti/megmutatja a tobbit. Ezzel csak az a baj, hogy igy sajat timeline control kene, amit meg nem tudom hogyan lehetne megcsinalni.

MPMediaPlayerController problemak

Tovabbra is tobb video egymas utan lejatszasat akarom megoldani es kozben belefutottam 2 problemaba:

1. Ha letrehozok egy MPMoviePlayerController-t akkor annak a retainCount-ja 1 ahogy kell, de amint meghivom rajta a play method-ot a retainCount 3 lesz. (A controller maga modul szinten van deklaralva, de ugyanez tortenik, ha helyben deklaralom, hozom letre es probalom lejatszani.) Igy persze egy sima release sem eleg a MPMoviePlayerDidFinishNotification kezeleseben. (Ugyanakkor, ha a controller-t nil-re allitom majd ujra letrehozom es meghivom a play mehtod-ot akkor mar csak 2 lesz a retainCount es nem 3.) Megneztem az Apple MoviePlayer peldakodjat es ott megjobban elszall a retainCount.

2. A masik problema, hogy ha az MPMoviePayerdidFinishNotification kezeleseben lenullazom a controller-t (akkor is, ha nil-re allitom) es utana egy masik videoval ujra letrehozom, majd meghivom rajta a play method-ot es a notification azert jott, mert a user megnyomta a "next" gombot, akkor a notification ujra megjon amint elindult a masodik video azaz a masodiknak rogton vege lesz. Ha a notification eredetileg azert jott, mert vege volt a videonak, akkor nincs ilyen problema.

Monday, January 4, 2010

UITableViewCell mozgatasa

Ha atvaltunk edit mode-ba, akkor meg nem tudjuk mozgatni a cellakat, ha nem implementaltuk (akar uresen) a tableView:moveRowAtIndexPath:toIndexPath methodot.

Ha nem akarjuk, hogy az osszes cella mozgathato legyen, akkor meg kell irni a tableView:canMoveRowAtIndexPath method-ot is.

Ha pedig nem szeretnenk, hogy akarhova at lehessen mozgatni akkor a tableView:targetIndexPathForMoveFromRowAtIndexPath:toProposedIndexPath method-ot.