parse docs ios swift parse.com pfimageview

ios - docs - ¿Por qué escalar para rellenar da una imagen más grande que UIImageVIew tamaño?(usando swift)



docs parse platform (5)

Estoy tratando de mostrar una lista de nombres de lugares, incluida su foto usando PFQueryTableViewController . Se incluye en ParseUI SDK de parse.com

He conseguido mostrar la imagen. Desafortunadamente, cuando cambio el modo UIImageView a Relleno de aspecto, la imagen se vuelve más grande de lo que debería ser.

aquí están las imagenes:

https://dl.dropboxusercontent.com/u/86529526/pic_normal.png https://dl.dropboxusercontent.com/u/86529526/pic_error.png

en pic_normal , verás dos celdas, con dos imágenes normales. en pic_error , la segunda imagen de la celda superpondrá la segunda celda.

¿Puede alguien ayudarme a solucionar este problema? También pongo todo mi código aquí:

import UIKit class TableViewController: PFQueryTableViewController, UISearchBarDelegate { @IBOutlet var searchBar: UISearchBar! // Initialise the PFQueryTable tableview override init(style: UITableViewStyle, className: String!) { super.init(style: style, className: className) } required init(coder aDecoder: NSCoder) { super.init(coder: aDecoder) // Configure the PFQueryTableView self.pullToRefreshEnabled = true self.paginationEnabled = false } // Define the query that will provide the data for the table view override func queryForTable() -> PFQuery { // Start the query object var query = PFQuery(className: "Places") // query with pointer query.includeKey("mainPhoto") // Add a where clause if there is a search criteria if searchBar.text != "" { query.whereKey("name", containsString: searchBar.text) } // Order the results query.orderByAscending("name") // Return the qwuery object return query } //override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath, object: PFObject) -> PFTableViewCell? { var cell = tableView.dequeueReusableCellWithIdentifier("CustomCell") as! CustomTableViewCell! if cell == nil { cell = CustomTableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "CustomCell") } // Extract values from the PFObject to display in the table cell if let name = object["name"] as? String{ cell.name.text = name } // display initial image var initialThumbnail = UIImage(named: "question") cell.photo.image = initialThumbnail // extract image from pointer if let pointer = object["mainPhoto"] as? PFObject { cell.detail.text = pointer["photoTitle"] as? String! if let thumbnail = pointer["photo"] as? PFFile { cell.photo.file = thumbnail cell.photo.loadInBackground() } } cell.sendSubviewToBack(cell.photo) // return the cell return cell } // In a storyboard-based application, you will often want to do a little preparation before navigation override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { // Get the new view controller using [segue destinationViewController]. var detailScene = segue.destinationViewController as! DetailViewController // Pass the selected object to the destination view controller. if let indexPath = self.tableView.indexPathForSelectedRow() { let row = Int(indexPath.row) detailScene.currentObject = objects[row] as? PFObject } } override func viewDidLoad(){ super.viewDidLoad() let tapGesture = UITapGestureRecognizer(target:self, action:Selector("hideKeyboard")) tapGesture.cancelsTouchesInView = true tableView.addGestureRecognizer(tapGesture) } func hideKeyboard(){ tableView.endEditing(true) } override func viewDidAppear(animated: Bool) { // Refresh the table to ensure any data changes are displayed tableView.reloadData() // Delegate the search bar to this table view class searchBar.delegate = self } func searchBarTextDidEndEditing(searchBar: UISearchBar) { // Dismiss the keyboard searchBar.resignFirstResponder() // Force reload of table data self.loadObjects() } func searchBarSearchButtonClicked(searchBar: UISearchBar) { // Dismiss the keyboard searchBar.resignFirstResponder() // Force reload of table data self.loadObjects() } func searchBarCancelButtonClicked(searchBar: UISearchBar) { // Clear any search criteria searchBar.text = "" // Dismiss the keyboard searchBar.resignFirstResponder() // Force reload of table data self.loadObjects() } }


Alternativamente, para los tipos que prefieren el Generador de Interfaz , puede revisar las Clip Subviews de Clip Subviews en su vista de imagen cuando elija Aspect Fill , luego no cambiará el tamaño de su Vista de imagen pero mantendrá la misma relación de aspecto.


Con el modo de contenido configurado en Aspect Fill , intente establecer los clips en los límites también en verdadero, ya que el aspect fill modo de contenido continúa llenando el cuadro de la vista de la imagen hasta que el cuadro esté completamente lleno de contenido, manteniendo la aspect ratio intacta. En el proceso de llenado del contenedor con una relación de aspecto que mantiene la imagen, el marco vertical u horizontal se llena completamente, y el relleno continúa hasta que la otra parte (si es horizontal más que vertical o viceversa) se llena por completo. Por lo tanto, la primera parte rellena, ya sea vertical u horizontal, se saldrá de los límites y el contenido será visible fuera del marco de la vista de la imagen. Para recortar el contenido extra, necesitamos recortar la porción extra utilizando la propiedad clipsToBounds de clipsToBounds establecida en true

cell.photo.contentMode = UIViewContentMode.ScaleAspectFill cell.photo.clipsToBounds = true


De Apple Doc :

UIViewContentModeScaleToFill

Escala el contenido para adaptarse al tamaño de sí mismo al cambiar la relación de aspecto del contenido si es necesario

UIViewContentModeScaleAspectFill

Escala el contenido para completar el tamaño de la vista. Alguna parte del contenido puede recortarse para llenar los límites de la vista.

Así que tus opciones son usar

  • UIViewContentModeScaleToFill , y posiblemente cambie la relación de aspecto de la imagen mostrada,
  • UIViewContentModeScaleAspectFill , y use clipToBounds = YES en su PFImageView , para recortar partes de la imagen fuera de los límites.

Si desea mantener la relación de aspecto con un ancho variable, entonces use AspectFill y también use la propiedad imageview clipstoBounds, no expandirá la vista de la imagen más allá del marco


Referencia: una respuesta en otra publicación que le proporciona una visión clara: https://.com/a/14220605/3021573