2016-08-01 36 views
10

Ich entwickle eine iOS-Anwendung, die Beiträge von einem Server in eine UICollectionView lädt. Die Auflistungsansichtszelle enthält eine UIImageView, die am unteren Rand der Zelle fixiert ist.Sammlung Ansicht Zellen laden Bilder nicht korrekt

UICollectionViewCell

Jedes Mal, wenn ich die Anwendung und die Sammlung Ansicht Lasten starten, werden alle Bilder laden nicht korrekt, aber für das letzte Bild, das die richtigen Dimensionen ist. Alle Zellen werden auf die gleiche Weise formatiert.

UICollectionView

ich bisher gearbeitet hat, eine Vielzahl von Lösungen, aber nichts versucht.

Was ich vermute, ist, dass die Bilder nicht fertig geladen sind, bevor sie auf die UIImageView jeder Zelle (mit Ausnahme der letzten in diesem Fall) gesetzt werden. Dies scheint nicht möglich, obwohl die Zellen nach dem Aufstehen eine erfolgreiche Antwort neu geladen werden ..

Dies ist mein Code für diese bestimmte Funktion (mit Alamofire)

func getAllPosts(){ 

    let url = "\(Constants.baseURL)/posts/" 
    let parameters = ["user_id": "\(userProfile!.getId())"] 

    Alamofire.request(.POST, url, parameters: parameters, encoding: .JSON) 
     .validate(contentType: ["application/json"]) 
     .responseString { response in 
      switch response.result { 

      case .Success: 

       var postsArray = Array<[String: AnyObject]>() 

       do { 

        let json = try NSJSONSerialization.JSONObjectWithData(response.data!, options: NSJSONReadingOptions.MutableContainers) 



        for post in json as! [AnyObject] { 

         postsArray.append(post as! [String: AnyObject]) 

        } 

        //invert array of posts so that latest load first! 

        postsArray = postsArray.reverse() 

       } catch { 

       } 

       //convert json to Post objects and reload the view 

       self.initialisePosts(postsArray) 

       self.collectionView?.reloadData() 


      case .Failure(let error): 
       print(error) 
      } 
    } 
} 

Alle Hilfe ist willkommen.

Edit: Im Folgenden sind die aktuellen Einschränkungen für die UIImageView

Constraints

Edit 2: Hier ist der Code, die Zellen für die Formatierung

override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 

    // get a reference to our postcell with no image 
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifiers[0], forIndexPath: indexPath) as! PostCell 

    guard let _: Post? = posts[indexPath.row] else { 
     return cell 
    } 

    return configurePostCell(cell, post: posts[indexPath.row])! 
} 

func configurePostCell(cell: UICollectionViewCell, post: Post) -> PostCell?{ 
    if let cell = cell as? PostCell { 

     cell.author.text = post.user_name 
     cell.date.text = formatter.stringFromDate(post.pub_date!) 
     cell.desc.text = post.desc 


     cell.layer.cornerRadius = 5 //set corner radius here 

     cell.advertImage.image = post.advert?.advert_image 


     return cell 
    } 

    return nil 
} 

Update: Mit @ Michaels Beratung Ich habe festgestellt, dass die Zelle Bilder laden korrekt sind.

Correctly loading image

aber, dass die Zellenhöhe auf mysteriöse Weise abgeschnitten .. Größe

Storyboard Editor Zelle 50 Pixel wird

Storyboard editor cell size

Zellengröße zur Laufzeit

Cell size at run-time

Das scheint das Problem zu sein, aber ich habe noch keine Lösung gefunden.

Update: Nach zwei Stunden auf der Bounty habe ich mich entschieden, es @ @ Michael zu vergeben, weil seine Antwort mir zu weiteren Untersuchungen meiner Frage, die noch immer läuft, geholfen hat.

+1

Wo Ihr Code für Bilder Sammlung Ansicht Einstellung? Haben Sie für UIImageView eine Höhenbeschränkung angegeben? –

+0

oh ja tut mir leid, ich werde die Frage jetzt bearbeiten, um diese Informationen aufzunehmen. – Danoram

+0

tun Sie es in der main_queue –

Antwort

3

Verwenden Sie zunächst die Schaltfläche Debughierarchie anzeigen, um zur Laufzeit auf Anomalien in den Tabellenzellen zu prüfen.

Dann Haltepunkt bei der Zellenerstellung und inspiziere die UIImage, die du auf die Zelle setzen willst und stelle sicher, dass die Größe stimmt. Wenn Sie das Bild, das Sie heruntergeladen haben, einer lokalen Variablen zuweisen, können Sie es wahrscheinlich auch schnell anschauen, um zu sehen, ob es richtig aussieht.

Wenn alles sinnvoll erscheint, überprüfen Sie, ob Ihr Auto-Layout-Code robust ist.

Überprüfen Sie, indem Sie das Herunterladen von Bildern aus der Situation entfernen. Ich würde dies tun:

  1. Remove Einstellung des Bildes überhaupt, aber stellen Sie den Hintergrund des Bildes zu UIColor.Red oder etwas und überprüfen sie alle Layout schön wie wenig mehr als normal UIViews.
  2. Betten Sie ein Bild im App-Bundle als PNG ein und legen Sie es anstelle des heruntergeladenen Bildes fest. Schau dir nochmal an, wie es rendert.
  3. eine andere Größen Bild in der App-Bundle Versuchen und erneut prüfen -

(falls relevant vielleicht alle Ihre Bilder die gleiche Größe sowieso sind) Wenn das alles gut aussieht, dann wissen Sie, es ist um den Download oder das Layout dieser Serverbilder.

+0

Hallo Michael. Danke für deinen Rat! Ich habe es geschafft, mithilfe der Debug-View-Hierachy zu finden, dass die Zellen tatsächlich um 50 Pixel gekürzt werden. Ich habe meine Frage aktualisiert. – Danoram

+0

Ist das Seitenverhältnis-Constraint korrekt? Es sieht so aus, als würde 15: 4 eine Bildhöhe von 80 für eine Zellenbreite von 300 ergeben (wenn man davon ausgeht, dass die Zellen 300 Punkte breit sind). Ist das die Bildhöhe, die Sie erwartet haben? (300/15) * 4 = 80 – Michael

+0

Ja, die Bildhöhe ist '80px' für eine Zellenbreite von' 300', hat aber nur eine sichtbare Höhe von '30px', weil die Zelle um' 50px' abgeschnitten wird unten. Ich kann die benutzerdefinierte Größe anscheinend nicht auf '300x250' setzen, da sie zur Laufzeit auf' 300x200' zurückgesetzt wird. – Danoram

0

Ändern 15: 4Ratio auf konstanter Höhe (80px) und stellen heightForRowAtIndexPath auf eine konstante Höhe (250 Pixel)

+0

Das würde funktionieren, obwohl Sie die Verhältnisbeschränkung nicht entfernen müssen, außer es muss sein ein fixer 80 Punkt, egal wie groß der Bildschirm ist. Was ist, wenn es so ist, dann ist das völlig richtig. Wenn die Zellen jedoch abhängig von der Bildschirmbreite skaliert werden sollen, sollten Sie table.rowHeight auf UITableViewAutomaticDimension und die geschätzteRowHeight auf 250 setzen (siehe https: //www.raywenderlich.com/129059/self-dimensions-table-view-cells) – Michael

+0

Ich würde heightForRowAtIndexPath setzen SCREEN_WIDTH/ratio Setze Bild mit einem Verhältnis –