web-dev-qa-db-fra.com

Pourquoi l'échelle à remplir donne une image plus grande que la taille UIImageVIew? (en utilisant Swift)

J'essaie d'afficher une liste de noms de lieux, y compris sa photo à l'aide de PFQueryTableViewController. Il est inclus dans le SDK ParseUI de parse.com

J'ai réussi à montrer l'image. Malheureusement, lorsque je change le mode UIImageView en remplissage Aspect, l'image devient plus grande qu'elle ne devrait l'être.

voici les photos:

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

dans pic_normal, vous verrez deux cellules, avec deux images normales. dans pic_error, vous allez superposer la deuxième cellule à l'image de la première cellule.

quelqu'un peut m'aider à résoudre ce problème? J'ai également mis tout mon code ici:

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()
    }

}
22
Gibran

Avec le mode de contenu défini sur Aspect Fill, essayez également de définir les limites des clips sur true, la raison étant le mode de contenu aspect fill continue de remplir le cadre de la vue de l'image jusqu'à ce que le cadre soit entièrement rempli de contenu tout en conservant le aspect ratio intact. Dans le processus de remplissage du récipient avec un rapport d'aspect de maintien d'image, le cadre vertical ou horizontal est entièrement rempli et le remplissage se poursuit jusqu'à ce que l'autre partie (si horizontale que verticale ou vice versa) soit entièrement remplie. Ainsi, la première portion remplie à travers la verticale ou l'horizontale sortira des limites et le contenu sera visible en dehors du cadre de l'image. Pour découper le contenu supplémentaire, nous devons découper la partie supplémentaire en utilisant la propriété clipsToBounds de imageView définie sur true

cell.photo.contentMode = UIViewContentMode.ScaleAspectFill
cell.photo.clipsToBounds = true
82
Sanjay Mohnani

enter image description here

Référence: une réponse dans un autre post qui vous donne un aperçu clair - https://stackoverflow.com/a/14220605/302157

11
Avinash B

Alternativement pour les gars qui préfèrent Interface Builder , vous pouvez vérifier le Clip Subviews à la vue de votre image lorsque vous choisissez Aspect Fill, il ne redimensionnera pas votre vue d'image mais conservera toujours le même rapport hauteur/largeur.

enter image description here

9
RaptoX

Si vous souhaitez conserver le rapport hauteur/largeur avec une largeur variable, utilisez alors AspectFill et utilisez également la propriété imageview clipstoBounds, cela ne répartira pas l'image au-delà du cadre

4
Mukesh

De doc Apple :

UIViewContentModeScaleToFill

Met à l'échelle le contenu pour l'adapter à sa taille en modifiant le rapport d'aspect du contenu si nécessaire

UIViewContentModeScaleAspectFill

Met le contenu à l'échelle pour remplir la taille de la vue. Une partie du contenu peut être tronquée pour remplir les limites de la vue.

Donc, vos options sont d'utiliser

  • UIViewContentModeScaleToFill, et éventuellement modifier le rapport hauteur/largeur de l'image affichée,
  • UIViewContentModeScaleAspectFill, et utilisez clipToBounds = YES sur votre PFImageView, pour découper des parties de l'image en dehors des limites.
3
Jakub Vano