Immagini ed utilizzo delle UIImageView in Xcode

Le immagini sono uno dei pilastri fondamentali di qualsiasi progetto. L'occhio vuole sempre la sua parte, l'utilizzatore la prima cosa che fa è vedere se l'applicazione è "bella". Quindi, cominciamo ricordandoci cos'è un'immagine. Un'immagine digitale è un area rettangolare, il cui più piccolo componente si chiama Pixel. Un pixel ha la capacità di emettere luce [...]

Torna a: Corso creare applicazioni per iOS con il linguaggio Swift > I Principi dell'Auto Layout
  • Bresca

    piccolo errore. hai scritto:

    Ad esempio l’immagine 2x [-x] si riferisce ad un’immagine di risoluzione 2x per la Size Class Compact Width e Regular Height.

    invece di:

    Ad esempio l’immagine 2x [-+] si riferisce ad un’immagine di risoluzione 2x per la Size Class Compact Width e Regular Height.

    • Grazie milleee!! Correggo subito ;)

      Inviato da iPhone

  • Francesco

    Ciao Peppe,

    grazie al corso sono riuscito a comprendere e rifare senza problemi e con criterio il Tuo articolo sul parse e recupero dati da un file xml in una tabella, Sono contento… :-)

    ti volevo solo chiedere io ho personalizza i campi del mio file xml, vorrei sapere è possibile recuperare un url di una immagine remota e visualizzarla in campo della cella, si può fare, è permesso?

    esempio xml

    url immagine remota

    quale codice devo usare?
    questo quando è nella applicazione

    cell.IMGTipo.image = UIImage(named: “evento”)

    se voglio quello da remoto, come devo fare?

    Grazie

    • Ciao Francesco,
      Ovviamente è possibile farlo. Fino a qualche mese fa c’era l’url delle immagini anche nel mio XML poi l’ho tolto perché WordPress sta sviluppando le sue Rest Api in JSON e quindi la lettura verrà fatta con queste.

      Nel tuo xml quindi avrai un campo (o quello che è) con all’interno un URL. Poi dovrai scaricare l’immagine utilizzando la NSData(fromUrl: ) che ti scaricherà i dati da quell’url. Dato che sei sicuro che ci sia un’immagine dovrai castare a UIImage l’NSData restituito.

      Sarà qualcosa del genere

      var data = NSData(fromUrl: ilTuoUrl)
      var img = data as! UIImage

      cell.IMGTipo.image = img

      Considera che il download di un NSData può rallentare l’applicazione e quindi, è consigliato, lavorare con il multi threading.

      Fammi sapere ;)

      • Francesco

        Cia Peppe,

        ho risolto così tu che dici:

        override func viewDidLoad() {

        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        print(“Begin of code”)

        if let url = NSURL(string: “PERCORSOURL”) {

        imageURL.contentMode = .ScaleAspectFit

        //downloadImage(checkedUrl)

        print(“Download Started”)

        print(“lastPathComponent: ” + (url.lastPathComponent ?? “”))

        getDataFromUrl(url) { (data, response, error) in

        dispatch_async(dispatch_get_main_queue()) { () -> Void in

        guard let data = data where error == nil else { return }

        print(response?.suggestedFilename ?? “”)

        print(“Download Finished”)

        self.imageURL.image = UIImage(data: data)

        }

        }
        }

        print(“End of code. The image will continue downloading in the background and it will be loaded when it ends.”)

        } // Fine DiLoad

        override func didReceiveMemoryWarning() {

        super.didReceiveMemoryWarning()

        // Dispose of any resources that can be recreated.

        }

        func getDataFromUrl(url:NSURL, completion: ((data: NSData?, response: NSURLResponse?, error: NSError? ) -> Void)) {

        NSURLSession.sharedSession().dataTaskWithURL(url) { (data, response, error) in

        completion(data: data, response: response, error: error)

        }.resume()

        }

        • Perfetto Francesco, così non dovresti avere problemi. L’altro sistema è quello di scaricare l’immagine ad ogni aggiunta di una cella in tabella… maaa i metodi sono tantissimi ;)

  • Marco Dognini

    Ciao Peppe,
    non mi è chiaro il discorso delle Size Class per le immagini, ti spiego quello che sto facendo:
    – parto nel main.storyboard dalla Size Class Regular-Regular (quindi lavoro per gli iPad)
    – inserisco una UIimageView a schermo intero
    – vado nell’asset.xcasset e creo un nuovo image set con queste caratteristiche:
    Devices: iPad
    Widht: Any & Regular
    Height: Any & Regular
    – a questo punto inserisco le immagini specifiche per iPad in 1x[++] e 2x[++]
    – torno nel main.storyboard, associo l’image set alla UIimageView e mi trovo l’immagine col ?
    avvio il simulator e mi da errore!
    ….perchè?

    Quale sarebbe la procedura corretta?
    grazie

    • Ciao Marco,
      Per quanto riguarda il problema di Xcode che non mostra l’immagine, purtroppo è un problema comune che pare sia causato dalla non presenza di un’immagine di default per la Size Class Any-Any cioè la Universal.

      Non c’è un sistema per poter risolvere il problema se non quello di mettere un’immagine alla suddetta classe.

      In Xcode 8.0 ancora non ho provato a vedere se c’è o meno questo problema, quello che ho visto è che hanno cambiato il modo di utilizzare le Size Class.

      • marcodognini

        Ciao Peppe,

        io purtroppo però ho anche un errore che non riesco a capire.

        Sto ignorando la Size Class Any-Any e sto lavorando solo su quella Compact-Regular (quindi solo iPhone in portrait).

        Nell’asset.xcassets ho creato un Image Set specificando solo iPhone e cambiando Width in Any&Compact ed Heigth in Any&Regular.

        A questo punto metto le immagini 1x-2x-3x negli slot [-+] che sono quelli corrispondenti alla Size Class Compact-Regular.
        Fino a qui tutto ok, torno nel main e vedo l’immagine nella mia View ed anche nella preview degli iPhone in portrait.
        A questo punto avvio il simulator (iPhone 6) ma compare lo sfondo bianco con errore “Could not load the “Home Image iPhone” image referenced from a nib in the bundle with identifier “nomedell’app”.
        Mi spieghi cosa significa? Potrei eventualmente mandarti il progetto nel caso non fossi stato chiaro?
        grazie
        Marco

        • marcodognini

          credo di aver risolto Peppe! come mi hai suggerito ho creato 2 Image Set separati, uno esclusivo iPad ed uno iPhone.
          in iPad ho modificato W e H con Any&Regular per entrambe, ed aggiunto le immagini sia nelle caselle ** che in quelle ++
          in iPhone ho modificato W con Any&Compact ed H con Any&Regular, ed aggiunto le immagini sia nelle caselle ** che in quelle -+

          infine nello storyboard ho lavorato solo sulle 2 Size Class specifiche:
          wRegular hRegular per iPad
          wCompact hRegular per iPhone

          così facendo funziona tutto nel simulator, purtroppo come dici te è necessario mettere le immagini anche nelle caselle ** anche se poi sono inutili.

          Però ho notato che se simulo con iPhone mi compare comunque l’errore sopracitato (could not load etc…) relativo all’image set iPad, viceversa se simulo con iPad ho l’errore relativo all’image set iPhone…..come mai?

          • Ciao Marco,
            Hai selezionato sulla destra i Device iPhone e iPad? Comunque adesso ti contatto in privato così mi mandi il progetto e vedo meglio dove sta il problema.

  • Marcello

    Ciao Peppe, non capisco una cosa.. Ad esempio ho creato questo.. Praticamente le immagini mi saranno fornite in seguito da un array json… Diciamo che sto facendo qualche prova…al momento vorrei impostare la stessa immagine nella image view sotto ma non mi rispetta le dimensioni scalate dell imageview, come posso fare?

Start typing and press Enter to search

size-class-in-xcode-con-auto-layout