{"id":11249,"date":"2015-02-11T16:58:48","date_gmt":"2015-02-11T15:58:48","guid":{"rendered":"http:\/\/www.devapp.it\/wordpress\/?p=11249"},"modified":"2016-06-07T14:57:29","modified_gmt":"2016-06-07T12:57:29","slug":"portiamo-i-css-nelle-nostre-applicazioni-ios-e-android-native","status":"publish","type":"post","link":"https:\/\/www.devapp.it\/wordpress\/portiamo-i-css-nelle-nostre-applicazioni-ios-e-android-native\/","title":{"rendered":"Portiamo i CSS nelle nostre applicazioni iOS e Android native"},"content":{"rendered":"<p>Oggi vi presento una libreria che mi ha veramente colpito e ritengo veramente utile e degna di nota.\u00a0La libreria di cui voglio parlare \u00e8 <a href=\"https:\/\/github.com\/Pixate\/pixate-freestyle-ios\" target=\"_blank\">pixate-freestyle<\/a> ed \u00e8 una libreria che permette di definire il <strong>design delle applicazioni iOS<\/strong> (anche android a dire il vero) <strong>utilizzando i CSS<\/strong>.<\/p>\n<p>L&#8217;idea alla base \u00e8 semplice e riesce nel suo intento in modo pi\u00f9 efficace di qualsiasi altra strategia che io abbia mai provato.<\/p>\n<p><!--more--><\/p>\n<p>Chi <strong>sviluppa applicazioni iOS<\/strong> per mestiere o per passione sa quanto il layout delle app sia importante e quanto possa essere <em>time-consuming<\/em> e <em>error-prone<\/em> dover definire per ciascun elemento della nostra GUI tutti i parametri via codice oppure via storyboard&#8230; definire il colore dei pulsanti,\u00a0 font, le dimensioni e se vogliamo un pulsante con una sfumatura?\u00a0Insomma un vero lavoraccio che porta via un mare di tempo. Inoltre quando abbiamo finito la nostra UI il designer di turno decide di cambiare font e allora l\u00ec a cambiare tutte le label nello storyboard&#8230;<\/p>\n<p>Ci sono ovviamente alcune ottimizzazioni, per esempio io spesso uso delle category sulle classi <em>UIColor<\/em> e <em>UIFont<\/em>, oppure ancora creo delle specifiche subclass di UILabel con il formato gi\u00e0 corretto.<\/p>\n<p>La soluzione di Apple passa attraverso l&#8217;uso del protocollo <em>UIAppearance<\/em> con il quale \u00e8 possibile definire una volta per tutte molte propriet\u00e0 dei nostri controlli. Purtroppo questi valori valgono per <strong>tutti<\/strong> i controlli dello stesso tipo e non mi pare che sia molto comune avere un&#8217;app dove <strong>tutte<\/strong> le label hanno lo stesso colore. Per dovere di precisione diciamo che con <em>UIAppearance<\/em> \u00e8 possibile definire uno stile per quei controlli che sono contenuti all&#8217;interno di specifici contenitori.. per cui per esempio \u00e8 possibile definire la font di tutte le label che sono all&#8217;interno di una <em>UITableViewCell<\/em>&#8230; anche in questo caso per\u00f2 il tutto si rivela molto rigido e poco versatile.<\/p>\n<p>Davanti a questo problema l&#8217;autore della libreria deve aver pensato &#8220;ehi ma questo problema l&#8217;hanno risolto 10 anni fa (wikipedia dice 16 anni fa, so proprio vecchio) per le pagine html, non possiamo usare lo stesso approccio?&#8221; ed ecco che \u00e8 nata <strong>pixate<\/strong>.<\/p>\n<p>&nbsp;<\/p>\n<blockquote><p>Pixate Freestyle is a native iOS library that styles native controls with CSS. With Freestyle, you can replace many complicated lines of Objective-C with a few lines of CSS.<\/p><\/blockquote>\n<p>&nbsp;<\/p>\n<p>Come tutte le librerie che si rispettino \u00e8 possibile installarla tramite cocoapods \ud83d\ude42<\/p>\n<pre class=\"lang:sh decode:true\">pod 'PixateFreestyle'<\/pre>\n<p>Una volta installata la libreria va &#8220;inizializzata&#8221;\u00a0 nel main della nostra app,\u00a0 per cui\u00a0il vostro main dovrebbe essere pi\u00f9 o meno cos\u00ec<\/p>\n<pre class=\"lang:objc decode:true\">#import &lt;UIKit\/UIKit.h&gt;\r\n#import \"AppDelegate.h\"\r\n#import &lt;PixateFreestyle\/PixateFreestyle.h&gt;\r\n\r\n\r\nint main(int argc, char * argv[]) {\r\n    @autoreleasepool {\r\n        [PixateFreestyle initializePixateFreestyle];\r\n        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));\r\n    }\r\n}<\/pre>\n<p>&nbsp;<\/p>\n<p>Adesso la libreria \u00e8 installata e pronta all&#8217;uso. Proviamo a creare un nuovo file all&#8217;interno del progetto e lo chiamiamo default.css e inseriamo al suo interno una semplice porzione di css<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"lang:css decode:true\">label {\r\n    font-family: \"American Typewriter\";\r\n    font-size: 20;\r\n    text: \"Pixate Freestyle\";\r\n    color: red;\r\n}\r\n\r\nview {\r\n\u00a0\u00a0\u00a0 background-color: #ddd;\r\n}\r\n<\/pre>\n<p>con questo css andremo a modificare <strong>tutte<\/strong> le label infatti baster\u00e0 trascinare una label nel nostro viewcontroller e una volta eseguita l&#8217;app il risultato sar\u00e0 questo:<\/p>\n<p><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2015\/01\/Screenshot-2015-01-24-07.33.33.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-11255 size-full\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2015\/01\/Screenshot-2015-01-24-07.33.33-e1422081305664.png\" alt=\"\" width=\"400\" height=\"658\" \/><\/a><\/p>\n<p>Ma come fare per cambiare lo stile di alcune label?\u00a0 \u00c8 veramente semplice, prima di tutto scriviamo il nostro css specifico per una classe di label (classe nel senso CSS del termine \ud83d\ude42 non obj-c)<\/p>\n<pre class=\"lang:css decode:true\">.subtitle {\r\n    font-size: 18;\r\n    text: \"subtitle\";\r\n    color: #000;\r\n}\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>fatto questo associamo la classe &#8220;subtitle&#8221; alla nostra label tramite i runtime-attribute. Guardate il video qui in basso per le istruzioni dettagliate.<br \/>\n<iframe loading=\"lazy\" width=\"500\" height=\"375\" src=\"\/\/player.vimeo.com\/video\/79832578\" frameborder=\"0\" webkitallowfullscreen=\"webkitallowfullscreen\" mozallowfullscreen=\"mozallowfullscreen\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/p>\n<p>&nbsp;<\/p>\n<p>Il risultato sar\u00e0 questo:<\/p>\n<p><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2015\/01\/Screenshot-2015-01-24-07.47.20.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-11260 size-full\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2015\/01\/Screenshot-2015-01-24-07.47.20-e1422082087159.png\" alt=\"\" width=\"400\" height=\"658\" \/><\/a>Ok, visto cos\u00ec non sembra\u00a0molto accattivante \ud83d\ude00\u00a0 Per\u00f2 magari questa immagine rende meglio l&#8217;idea:<\/p>\n<p>&nbsp;<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\" alignnone\" src=\"http:\/\/pixate.github.io\/pixate-freestyle-ios\/themes\/assets\/pixate_blue_typography.png\" alt=\"\" width=\"300\" height=\"604\" \/><img loading=\"lazy\" decoding=\"async\" class=\"alignnone\" src=\"http:\/\/pixate.github.io\/pixate-freestyle-ios\/themes\/assets\/pixate_blue_form_styles.png\" alt=\"\" width=\"300\" height=\"604\" \/><\/p>\n<p>&nbsp;<\/p>\n<h2>Mamma guarda: live!<\/h2>\n<p>Un aspetto ancora pi\u00f9 interessante di questa libreria \u00e8 che le modifiche al css possono essere effettuate <em>live,<\/em> cio\u00e8 mentre l&#8217;applicazione \u00e8 attiva: il nuovo stile viene immediatamente applicato senza necessit\u00e0 di ricompilare l&#8217;app.<\/p>\n<p>&nbsp;<\/p>\n<p>Per attivare questo comportamento, all&#8217;interno del metodo <em>application:didFinishLaunchingWithOptions:<\/em> scriviamo queste righe:<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"lang:objc decode:true \">NSLog(@\"%@\", [PixateFreestyle currentApplicationStylesheet].filePath);\r\nPixateFreestyle.currentApplicationStylesheet.monitorChanges = YES;\r\n    \r\nself.window.styleMode = PXStylingNormal;<\/pre>\n<p>La prima riga ha il solo scopo di loggare nella console il path completo del css corrente, perch\u00e9 cambia ad ogni esecuzione ed \u00e8 annidato all&#8217;interno delle cartelle del simulatore.<\/p>\n<p>La seconda riga specifica attiva il monitoraggio del file css.<\/p>\n<p>La terza e ultima riga specifica la modalit\u00e0 per la main windows, necessaria per fare in modo che reagisca ai cambiamenti del css.<\/p>\n<p>Se tutto \u00e8 andato per il verso giusto, aprendo e modificando il file il cui percorso \u00e8 stato stampato in console, dovreste immediatamente visualizzarne il risultato sul simulatore.<\/p>\n<p>&nbsp;<\/p>\n<p><iframe loading=\"lazy\" width=\"560\" height=\"315\" src=\"\/\/www.youtube.com\/embed\/eYAgRsQogww\" frameborder=\"0\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/p>\n<p>Spero che questa segnalazione vi sia piaciuta.<\/p>\n<p>Alla prossima!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Oggi vi presento una libreria che mi ha veramente colpito e ritengo veramente utile e degna di&#8230;<\/p>\n","protected":false},"author":53,"featured_media":11271,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[70,481,1],"tags":[923,1493,1491,1373,1492,283],"class_list":["post-11249","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-grafica-e-design","category-risorse-utili","category-tutorial-pratici","tag-css-ios","tag-design-app-con-i-css","tag-formattare-app-ios-con-i-css","tag-ios-ui-design","tag-pixate-freestyle","tag-tutorial-programmazione-iphone"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/11249","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=11249"}],"version-history":[{"count":19,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/11249\/revisions"}],"predecessor-version":[{"id":12116,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/11249\/revisions\/12116"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media\/11271"}],"wp:attachment":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media?parent=11249"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/categories?post=11249"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/tags?post=11249"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}