2016-05-31 27 views
1

Ich versuche, eine UIImageView zu erhalten, um seine Höhe dynamisch nach dem Bild zu ändern, das es gegeben wird. Das UIImageView befindet sich in einer benutzerdefinierten Zelle.Autoresizing UIImageView in einer TableView-Zelle mit Autolayout

Hier sind die Randbedingungen:

  1. muss von der Kante des Bildschirms zur anderen Kante erstrecken.
  2. Die Höhe muss dynamisch sein und darf die Rahmenbreite nicht überschreiten.

Bisher habe ich die folgenden Einschränkungen die UIImageView mit dem Interface Builder hinzugefügt:

enter image description here

ich die Höhe Beschränkung im Code verwenden (im Folgenden als postHeight) die Höhe des ändern UIImageView wie unten gezeigt:

import UIKit 

class ImageTableViewCell: UITableViewCell { 

    @IBOutlet weak var postImage: UIImageView! 
    @IBOutlet weak var postHeight: NSLayoutConstraint! 

    var post:UIImage! = nil { 
     didSet { 
      let x = post.size.width 
      let y = post.size.height 
      var newHeight = (y/x) * self.frame.width 
      newHeight = newHeight > self.frame.width ? self.frame.width : newHeight 
      postHeight.constant = newHeight 
      postImage.contentMode = .ScaleAspectFit 
      postImage.image = post 
     } 
    } 

    override func awakeFromNib() { 
     super.awakeFromNib() 
     // Initialization code 
    } 

    override func setSelected(selected: Bool, animated: Bool) { 
     super.setSelected(selected, animated: animated) 

     // Configure the view for the selected state 
    } 

} 

Beim Ausführen zeigt die Konsole, dass es einige Einschränkungen nicht erfüllen konnte. Und Ausgänge:

TryImageView[89952:2477907] Unable to simultaneously satisfy constraints. 
    Probably at least one of the constraints in the following list is one you don't want. 
    Try this: 
     (1) look at each constraint and try to figure out which you don't expect; 
     (2) find the code that added the unwanted constraint or constraints and fix it. 
(
    "<NSLayoutConstraint:0x7aef8560 V:[UIImageView:0x7aef96b0(291.355)]>", 
    "<NSLayoutConstraint:0x7aef9b30 UIImageView:0x7aef96b0.top == UITableViewCellContentView:0x7aef9340.topMargin - 8>", 
    "<NSLayoutConstraint:0x7aef9b90 UITableViewCellContentView:0x7aef9340.bottomMargin == UIImageView:0x7aef96b0.bottom - 8.5>", 
    "<NSLayoutConstraint:0x7ae5e990 'UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView:0x7aef9340(291)]>" 
) 

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x7aef8560 V:[UIImageView:0x7aef96b0(291.355)]> 

Die Tabellenansicht hat dies in seiner viewDidLoad(), da die Zellen als auch auf die Größe benötigen.

override func viewDidLoad() { 
     super.viewDidLoad() 
     self.tableView.estimatedRowHeight = 90 
     self.tableView.rowHeight = UITableViewAutomaticDimension 
} 

Irgendwelche Ideen, warum meine Einschränkungen nicht funktionieren? Dank

Antwort

0

Sie setzen Einschränkungen für Ihr Bild darstellen als:

  • Verbunden nach oben, links, rechts und unten
  • Feste Höhe

die Höhe Einschränkung entfernen. Angenommen, die Höhe Ihrer Zelle ist 50. Sie können die Höhe Ihrer Bildansicht nicht festlegen. Wenn es die gesamte Zelle bedeckt, wird seine Höhe ebenfalls 50 sein. Sie müssen die Höhe Ihrer Bilder herausfinden und sie in ein Array einfügen.

var heights = [CGFloat]() 

Wenn Sie Ihre Höhen finden:

heights = [50, 60, 70] 

Dann in der heightForRowAtIndexPath Methode, diese Höhen zurück.

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
    return heights[indexPath.row] 
} 

Sie sollten auch die contentMode Ihrer Bildansicht festlegen.

imageView.contentMode = .ScaleAspectFit 
Verwandte Themen