{"id":2402,"date":"2010-03-05T10:00:31","date_gmt":"2010-03-05T09:00:31","guid":{"rendered":"http:\/\/www.devapp.it\/wordpress\/?p=2402"},"modified":"2010-03-04T19:40:42","modified_gmt":"2010-03-04T18:40:42","slug":"uibutton-guida-completa-alluso","status":"publish","type":"post","link":"https:\/\/www.devapp.it\/wordpress\/uibutton-guida-completa-alluso\/","title":{"rendered":"UIButton &#8211; Guida completa all&#8217;uso"},"content":{"rendered":"<p>Continuiamo il nostro tour dell&#8217;UIkit framework analizzando oggi la classe UIButton.<\/p>\n<p>Come sempre, la guida di riferimento \u00e8 la Class Reference pubblicata da Apple\u00ae che potete trovare a <a href=\"http:\/\/developer.apple.com\/iphone\/library\/documentation\/UIKit\/Reference\/UIButton_Class\/UIButton\/UIButton.html\" target=\"_blank\">questo indirizzo<\/a>.<\/p>\n<p>Analizzando la Class Reference, l&#8217;informazione principale, e non a caso Apple\u00ae la inserisce per prima, \u00e8 l&#8217;albero &#8220;genealogico&#8221; della classe in questione, per esempio per la classe UIButton la reference dice:<\/p>\n<pre>inherits from UIControl : UIView : UIResponder : NSObject<\/pre>\n<p>quindi la gerarchia \u00e8 questa:<\/p>\n<p><center><\/p>\n<div id=\"attachment_2404\" style=\"width: 277px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/03\/UIButton.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-2404\" class=\"size-full wp-image-2404\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/03\/UIButton.png\" alt=\"\" width=\"267\" height=\"244\" \/><\/a><\/p>\n<p id=\"caption-attachment-2404\" class=\"wp-caption-text\">Gerarchia della classe UIButton<\/p>\n<\/div>\n<p><\/center><!--more--><\/p>\n<p>Ho segnato in verde le classi che abbiamo gi\u00e0 trattato su questo sito, in rosso la classe che trattiamo oggi.<\/p>\n<p>Come \u00e8 facile intuire, pi\u00f9 ci spostiamo verso il basso nella gerarchia delle classi, pi\u00f9 saranno i metodi e le propriet\u00e0 utilizzabili sulla classe stessa, questo perch\u00e9 non solo dobbiamo considerare metodi e propriet\u00e0 proprietari della classe, ma anche tutti quelli delle sue superclassi ereditati.<\/p>\n<p>Credo che tutti sappiano trascinare un UIButton da Interface Builder, vediamo invece come aggiungerne uno alle nostre view a <em>runtime<\/em><\/p>\n<pre lang=\"objc\" escaped=\"true\">\r\n[UIButton * btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];btn.frame = CGRectMake(0, 0, 100, 50);\r\n[btn setTitle:@\"Hello, world!\" forState:UIControlStateNormal];\r\n[self.view addSubview:btn];\r\n<\/pre>\n<p>Esaminando il codice vediamo subito un particolare costruttore che prende in input un (UIButtonType)buttonType; questo pu\u00f2 avere 6 possibili diversi valori ed il risultato \u00e8 quello che si vede in questa immagine.<\/p>\n<p><center><\/p>\n<div id=\"attachment_2407\" style=\"width: 322px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/03\/uibuttonType.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-2407\" class=\"size-full wp-image-2407\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/03\/uibuttonType.png\" alt=\"\" width=\"312\" height=\"256\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/03\/uibuttonType.png 312w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/03\/uibuttonType-300x246.png 300w\" sizes=\"auto, (max-width: 312px) 100vw, 312px\" \/><\/a><\/p>\n<p id=\"caption-attachment-2407\" class=\"wp-caption-text\">UIButtonType<\/p>\n<\/div>\n<p><\/center><\/p>\n<p>Nella prima riga non c&#8217;\u00e8 un errore, il pulsante non si vede perch\u00e9 \u00e8 un rettangolo trasparente. Questo tipo di pulsante pu\u00f2 essere comodamente usato per ottenere un pulsante personalizzato, (se si chiama &#8220;custom&#8221; ci sar\u00e0 un perch\u00e9) infatti baster\u00e0 inserire sotto il pulsante un controllo UIImageView di dimensioni e contenuto appropriato per ottenere un pulsante con qualsiasi immagine.<\/p>\n<p>Per i fans di Interface Builder lo stesso risultato \u00e8 ottenibile selezionando la voce corrente nel men\u00f9 a discesa presente in &#8220;attributes inspector&#8221;:<\/p>\n<p><center><\/p>\n<div id=\"attachment_2408\" style=\"width: 495px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/03\/UIbuttontype_IB.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-2408\" class=\"size-full wp-image-2408\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/03\/UIbuttontype_IB.png\" alt=\"UibuttonType su Interface Builder\" width=\"485\" height=\"197\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/03\/UIbuttontype_IB.png 485w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/03\/UIbuttontype_IB-300x121.png 300w\" sizes=\"auto, (max-width: 485px) 100vw, 485px\" \/><\/a><\/p>\n<p id=\"caption-attachment-2408\" class=\"wp-caption-text\">UIButtonType in interface builder<\/p>\n<\/div>\n<p><\/center><\/p>\n<p>Nell&#8217;istruzione successiva ne impostiamo la dimensione e posizione tramite la funzione CGRectMake gi\u00e0 vista nell&#8217;articolo sulle UILabel.<\/p>\n<p>Gli oggetti della classe derivate da UIControl \u00a0possono trovarsi in diversi stati (anche pi\u00f9 contemporaneamente). Gli stati possibili sono:<\/p>\n<p><center><\/p>\n<table>\n<tr>\n<td><strong>UIControlStateNormal<\/strong><\/td>\n<td>il controllo \u00e8 attivo<\/td>\n<\/tr>\n<tr>\n<td><strong>UIControlStateHighlighted<\/strong><\/td>\n<td>\u00c8 lo stato &#8220;evidenziato&#8221; dei controlli. Un controllo si trova in questo stato quando viene toccato o quando viene trascinato. Possiamo verificare via codice se un controllo si trova in questo stato esaminando la sua propriet\u00e0 ishighlighted<\/td>\n<\/tr>\n<tr>\n<td><strong>UIControlStateDisabled<\/strong><\/td>\n<td>Il controllo \u00e8 disabilitato.<\/td>\n<\/tr>\n<td><strong>UIControlStateSelected<\/strong><\/td>\n<td>Stato &#8220;selezionato&#8221;. per molti controlli non \u00e8 disponibile.<\/td>\n<\/tr>\n<tr>\n<td><strong>UIControlStateApplication<\/strong><\/td>\n<td>Riservato per scopi interni alla nostra applicazione.<\/td>\n<\/tr>\n<tr>\n<td><strong>UIControlStateReserved<\/strong><\/td>\n<td>Riservato per scopi riservati del framework.<\/td>\n<\/tr>\n<\/table>\n<p><\/center><\/p>\n<p>Tutti i metodi che servono per modificare l&#8217;aspetto estetico dei controlli prendono quindi come parametro anche uno di questi valori. Sar\u00e0 quindi possibile realizzare per esempio un pulsante rosso che diventa grigio quando viene disattivato e verde quando viene cliccato.<\/p>\n<p>I metodi per modificare l&#8217;aspetto dei pulsanti sono:<\/p>\n<pre lang=\"objc\" escaped=\"true\">\r\n- (void)setTitle:(NSString *)title forState:(UIControlState)state\r\n- (void)setTitleColor:(UIColor *)color forState:(UIControlState)state\r\n- (void)setTitleShadowColor:(UIColor *)color forState:(UIControlState)state\r\n- (void)setImage:(UIImage *)image forState:(UIControlState)state\r\n- (void)setBackgroundImage:(UIImage *)image forState:(UIControlState)state=\"objc\"\r\n<\/pre>\n<p>Per ricevere in lettura questi valori sono previsti metodi analoghi:<\/p>\n<pre lang=\"objc\" escaped=\"true\">\r\n- (NSString *)titleForState:(UIControlState)state\r\n- (UIColor *)titleColorForState:(UIControlState)state\r\n- (UIColor *)titleShadowColorForState:(UIControlState)state\r\n- (UIImage *)imageForState:(UIControlState)state\r\n- (UIImage *)backgroundImageForState:(UIControlState)state\r\n<\/pre>\n<p>Come se non bastasse sono state previste anche delle <em>propriet\u00e0<\/em> che quindi vengono usate con la sintassi nome_oggetto.nomepropriet\u00e0:<\/p>\n<pre lang=\"objc\" escaped=\"true\">\r\n@property(nonatomic,readonly,retain) UILabel *titleLabel\r\n@property(nonatomic, readonly, retain) NSString *currentTitle\r\n@property(nonatomic, readonly, retain) UIColor *currentTitleColor\r\n@property(nonatomic, readonly, retain) UIColor *currentTitleShadowColor\r\n@property(nonatomic, readonly, retain) UIImage *currentImage\r\n@property(nonatomic, readonly, retain) UIImage *currentBackgroundImage\r\n<\/pre>\n<p>Tutte queste personalizzazioni possono essere specificate anche tramite interface builder, ma se vogliamo modificare le propriet\u00e0 di un controllo a runtime l&#8217;unica possibilit\u00e0 che abbiamo \u00e8 quella di adoperare i metodi forniti da apple.<\/p>\n<p><center><\/p>\n<div id=\"attachment_2419\" style=\"width: 454px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/03\/UIButton_property.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-2419\" class=\"size-full wp-image-2419\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/03\/UIButton_property.png\" alt=\"\" width=\"444\" height=\"240\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/03\/UIButton_property.png 444w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/03\/UIButton_property-300x162.png 300w\" sizes=\"auto, (max-width: 444px) 100vw, 444px\" \/><\/a><\/p>\n<p id=\"caption-attachment-2419\" class=\"wp-caption-text\">Propriet\u00e0 di UIButtton da interface builder<\/p>\n<\/div>\n<p><\/center><\/p>\n<p>Vediamo qualche esempio di utilizzo di questi metodi:<\/p>\n<pre lang=\"objc\" escaped=\"true\">\r\n\/\/Creo un oggetto UIButton di tipo TypeRoundedRect\r\nUIButton * btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];\r\n\/\/lo posiziono al centro schermo.\r\nbtn.frame = CGRectMake(35, 215, 250, 50);\r\n\/\/ne imposto \u00ecl titolo per lo stato normale.\r\n[btn setTitle:@\"STATO: NORMALE\" forState:UIControlStateNormal];\r\n\/\/ne imposto il colore del titolo per lo stato normal.\r\n[btn setTitleColor:[UIColor greenColor] forState:UIControlStateNormal];\r\n\/\/ne imposto il titolo per lo stato \"cliccato\"\r\n[btn setTitle:@\"STATO: CLICCATO\" forState:UIControlStateHighlighted];\r\n\/\/ne imposto il colore del titolo per lo stato \"cliccato\"\r\n[btn setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted];\r\n\/\/accedo alla propriet\u00e0 currentTitle\r\nNSLog(@\"IN QUESTO MOMENTO HA TITOLO: %@\", btn.currentTitle);\r\n\/\/accedo al valore del titolo allo stato \"cliccato.\"\r\nNSLog(@\"NELLO STATO ATTIVO HA TITOLO: %@\",[btn titleForState:UIControlStateHighlighted]);\r\n<\/pre>\n<p>Prima di concludere vediamo due ultime &#8220;chicche&#8221;: la prima \u00e8 la propriet\u00e0 <strong>showsTouchWhenHighlighted<\/strong>, che determina se il pulsante deve illuminarsi quando viene cliccato. Basta quindi scrivere <strong>btn.showsTouchWhenHighlighted = YES<\/strong> un&#8217;ottima animazione sui nostri pulsanti.<br \/>\nCon la seconda ed ultima chicca vediamo la possibilit\u00e0 di assegnare, sempre a runtime, una funzione ad un determinato evento sul controllo (per i pi\u00f9 smaliziati..una sorta di binding dinamico).<\/p>\n<p>Il metodo \u00e8 il seguente:<\/p>\n<pre lang=\"objc\" escaped=\"true\">\r\n- (void)addTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents\r\n<\/pre>\n<p>&#8220;target&#8221; \u00e8 l&#8217;oggetto che deve rispondere all&#8217;evento..di solito si utilizza &#8220;self&#8221;<\/p>\n<p>&#8220;action&#8221; \u00e8 un selector, ne parleremo magari pi\u00f9 avanti, per il momento basti dire che \u00e8 il nome di un metodo dichiarato nella nostra classe.<\/p>\n<p>&#8220;controlEvents&#8221; \u00e8 l&#8217;evento che che deve essere riconosciuto.<\/p>\n<p>nel nostro caso potremmo quindi scrivere<\/p>\n<pre lang=\"objc\" escaped=\"true\">\r\n[btn addTarget:self action:@selector(aMethod:) forControlEvents:UIControlEventTouchDown];\r\n<\/pre>\n<p>@lla prossima \ud83d\ude42<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/supporto-applicazioni\/parole-vietate-di-ignazio-calo\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2422\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/03\/bannerIgnazioc.png\" alt=\"\" width=\"480\" height=\"100\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/03\/bannerIgnazioc.png 480w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/03\/bannerIgnazioc-300x62.png 300w\" sizes=\"auto, (max-width: 480px) 100vw, 480px\" \/><\/a><br \/>\n<\/center><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Continuiamo il nostro tour dell&#8217;UIkit framework analizzando oggi la classe UIButton. Come sempre, la guida di riferimento&#8230;<\/p>\n","protected":false},"author":53,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[42],"tags":[42,132,23],"class_list":["post-2402","post","type-post","status-publish","format-standard","hentry","category-framework","tag-framework","tag-uibutton","tag-xcode"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/2402","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/users\/53"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/comments?post=2402"}],"version-history":[{"count":17,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/2402\/revisions"}],"predecessor-version":[{"id":2429,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/2402\/revisions\/2429"}],"wp:attachment":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media?parent=2402"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/categories?post=2402"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/tags?post=2402"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}