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()
}
}
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 useclipToBounds = YES
en suPFImageView
, 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