Programování v Cocoa - Základy kreslení - MujMAC.cz - Apple, Mac OS X, Apple iPod

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:

Seriály

Více seriálů



Začínáme s

Programování v Cocoa - Základy kreslení

9. října 2006, 00.00 | Všechno ještě zdaleka nevíme: co v případě, kdy nevystačíme se standardní sadou grafických objektů, a potřebovali bychom implementovat vlastní – nějakou "tabulku jež se nechová tak úplně jako tabulka" a podobně? V takovém případě je zapotřebí implementovat a vhodně využít vlastní podtřídu NSView – a to je právě to, co se naučíme teď.

V předcházejících dílech našeho seriálu o programování v prostředí Cocoa jsme se poměrně podrobně seznámili s kontroléry, a naučili jsme se je používat. Díky tomu již máme k dispozici základní informace, potřebné pro sestavování kompletních aplikací:

  • pro model použijeme služeb Foundation Kitu, jehož služby a možnosti jsme si dosti detailně popsali ve starších dílech našeho seriálu;
  • alterantivně – ještě s daleko menší námahou – můžeme pro model použít třídy Core Data; my jsme se o nich již zběžně zmínili a základy práce s nimi jsme si ukázali, a v budoucnosti se na tuto velmi účinnou knihovnu ještě podíváme blíže;
  • grafické uživatelské rozhraní aplikace můžeme sestavit z hotových tříd AppKitu. Ačkoli jsme se dosud žádné z těchto tříd nevěnovali detailně, mnoho z nich jsme již viděli v předcházejících příkladech, a ty nejdůležitější – jako nabídky, tlačítka, tabulky NSTableView či hierarchické browsery NSBrowser či NSOutlineView – díky tomu do značné míry dokážeme používat již nyní;
  • pro vazbu mezi modelem a grafickým uživatelským rozhraním využijeme právě kontrolérů.

Ačkoli tedy samozřejmě zdaleka doposavad nevíme vše a neznáme do detailů všechny možnosti prostředí Cocoa, víme již nyní všechno, co můžeme potřebovat pro implementaci víceméně libovolné aplikace (ponecháme-li stranou konkrétní speciální služby, jako je třeba práce se schránkou, podpora drag&drop a podobně).

Ačkoli... všechno vlastně ještě nevíme: co v případě, kdy nevystačíme se standardní sadou grafických objektů, a potřebovali bychom implementovat vlastní – nějakou "tabulku jež se nechová tak úplně jako tabulka" a podobně? V takovém případě je zapotřebí implementovat a vhodně využít vlastní podtřídu NSView – a to je právě to, co se naučíme teď.

NSView

My jsme se o třídě NSView samozřejmě již zmínili: víme, že se jedná o třádu, jež representuje v zásadě cokoli, co má nějaký vzhled a co můžeme vidět na obrazovce. Skutečně; ačkoli základem zobrazovacího systému Mac OS X jsou samozřejmě okna, okno vlastně "nevidíme"; okno totiž je vlastně jen obdélník na obrazovce, vyhrazený pro některý konkrétní proces. Konkrétní "obrázky", jež uvnitř tohoto obdélníku vidíme, jsou však realizovány právě prostřednictvím instancí třídy NSView a především jejích konkrétních podtříd.

Struktura "views" je hieararchická a v podstatě libovolně hluboká. Každé okno má jedno základní "view", jež (za normálních okolností) zabírá celý prostor okna, tvoříce jeho pozadí; tomuto základnímu grafickému objektu říkáme contentView. Kterékoli "view" pak může obsahovat libovolné množství podřízených instancí třídy NSView; pro ty samozřejmě platí totéž, a tak dále...

V běžném typickém okně tedy bude nejspíše jeho contentView, jež by mohlo mít dva podřízené objekty: titulek a obsah. Titulek samozřejmě je opět NSView a sám má další dceřiná view: "semafor" v levé části, vlastní titulek okna (a případnou ikonku souboru, jejž okno representuje) uprostřed, a má-li okno toolbar, pak také ikonku pro jeho otvírání a zavírání u pravého okraje.

Daleko složitější strukturu mívá obsah: i v tom nejjednodušším případě, jímž může být třeba prostý textový editor, se jedná o komplikovanou hierarchickou strukturu: na její nejvyšší úrovni obvykle bývá NSScrollView, jež obsahuje podřízené scrollery (to jsou samozřejmě také "views"), případná pravítka, a... ne, nikoli ještě vlastní datové view, nýbrž NSClipView; to teprve obsahuje kupříkladu NSTextView, jedná-li se o textový editor...

Základní atributy

Základními atributy objektu třídy NSView je jeho postavení v hierarchické struktuře; to je v zásadě určeno následujícími údaji:

  • superview: nadřízené view. Pro "nejvýše" postavené objekty třídy NSView jím může být již samotné contentView okna; celá hierarchie však může být libovolně hluboká;
  • frame: poloha tohoto view uvnitř jeho nadřízeného view (tedy uvnitř superview);
  • bounds: vlastní souřadnice tohoto view.

Vztah mezi frame a bounds může na první pohled vypadat jako poněkud matoucí; ve skutečnosti však je velmi jednoduchý, ale přitom nesmírně silný – umožňuje velmi pohodlné transformace souřadnic podle potřeby. Prvý z údajů – frame – určuje přesné umístění view v rámci jeho "nadřízeného". Druhý údaj – bounds – pak specifikuje, jak se mají uvnitř tohoto view interpretovat souřadnice.

Představme si okno o rozměrech 500 x 500 (pro zjednodušení předpokládejme, že jde o pixely – ve skutečnosti však jsou již velikosti oken určovány v abstraktních jednotkách, jež operační systém na pixely automaticky převádí; ještě v Tigeru však je skorem vždy poměr mezi těmito abstraktními jednotkami a pixely 1:1 – v Leopardu to téměř jistě platit nebude).

Za normálních okolností pak contentView tohoto okna bude mít "frame" o rozměrech také 500 x 500, s levým dolním rohem v bodě [0, 0]. Naproti tomu ale "bounds" tohoto contentView mohou vypadat docela jinak: dejme tomu, že budou mít levý dolní roh na souřadnicích [100, 100], a rozměry "bounds" budou také 100 x 100.

To znamená, že použijeme-li pak uvnitř tohoto view nějaké souřadnice – kupříkladu bod [150, 150] – systém je automaticky přepočítá – takovýto bod bude přesně uprostřed okna (tedy na souřadnicích [250, 250] uvnitř okna v jeho souřadné soustavě). Je zřejmé, jak k tomuto výsledku grafický subsystém došel? Ne-li, zamyslete se nad tím, že (a) "bounds" našeho contentView jsou takové, že bod [150, 150] musí být v jeho středu, a přitom (b) naše contentView kompletně pokrývá celé okno, takže jejich středy se musí shodovat.

Mac OS X toho nabízí více: zvolená views mohou počítat souřadnice v ose x podle potřeby standardně zdola, jako v každém slušném grafickém systému, nebo shora – to se dobře hodí pro textové editory a podobné záležitosti; Mac OS X taková views nazývá "převrácenými" (flipped). Kromě toho je dokonce možná pro konkrétní view předepsat obecnou rotaci o libovolný úhel, ale toho se v pravi využívá jen zcela výjimečně.

Princip kreslení

Nic nemůže být jednoduššího, než základní princip kreslení v Mac OS X: je-li třeba překreslit nějaké okno, toto okno prostě pošle svému contentView speciální zprávu, vyžadující překreslení.

Dostane-li tuto zprávu libovolné view – tedy samozřejmě i contentView – udělá dvě věci:

  • nejprve nastaví souřadnou soustavu tak, aby odpovídala jeho "bounds", a pak pošle samo sobě zprávu drawRect:. V rámci implementace této zprávy se vykreslí obsah samotného view;
  • pak view postupně předá požadavek na překreslení všem svým podřízeným.

To je celé: díky tomuto mechanismu se zcela automaticky vykreslí nejprve podklad, pak jej překryjí datová view, nad nimi se potom vykreslí konkrétní ovladače... přesně v tom pořadí, jež odpovídá hierarchickému systému views.

Právě na toto kreslení se hned v příštím dílu našeho seriálu podíváme podrobněji, a ukážeme si konkrétní příklad; při té příležitosti si také řekneme více o tom, jaké konkrétní služby Mac OS X nabízí programátorům pro skutečné vykreslení obsahu view uvnitř metody drawRect:.

Obsah seriálu (více o seriálu):

Tématické zařazení:

 » Rubriky  » Informace  

 » Rubriky  » Agregator  

 » Rubriky  » Začínáme s  

 » Rubriky  » Software  

 

 

 

Nejčtenější články
Nejlépe hodnocené články
Apple kurzy

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: