为什么要放大比UIImageVIew大小给更大的形象? (使用swift)

我试图显示地名的列表,包括使用PFQueryTableViewController的照片。 它包含在parse.com的ParseUI SDK中

我设法显示图像。 不幸的是,当我将UIImageView模式更改为Aspect fill时,图像变得比应该大。

这里是图片:

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

pic_normal ,你会看到两个单元格,两个正常的图像。 在pic_error ,第二个单元格将被第一个单元格图像覆盖。

谁能帮我解决这个问题? 我也把我的整个代码放在这里:

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

在内容模式设置为Aspect Fill ,尝试将剪辑设置为true,原因是内容模式aspect fill不断填充图像视图的框架,直到帧充满内容并保持aspect ratio不变。 在以图像保持纵横比填充容器的过程中,纵向或横向框架被充满,并且填充持续到另一个(如果横向比竖直或反之亦然)部分充满。 因此,垂直或水平方向上的第一个填充部分将超出边界,内容将在图像视图的框架外部可见。 要剪辑额外的内容,我们需要使用clipsToBoundsclipsToBounds属性设置为true剪辑额外的部分

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

另外对于喜欢Interface Builder的人来说,当你selectAspect Fill时候,你可以在你的图像视图中检查Clip Subviews ,那么它不会调整你的Image View的大小,但是仍然保持相同的宽高比。

在这里输入图像说明

如果你想保持不同宽度的宽高比,那么使用AspectFill,并使用imageview属性clipstoBounds,它不会将图像视图展开到帧之外

从苹果文件 :

UIViewContentModeScaleToFill

根据需要改变内容的纵横比来缩放内容以适合自己的尺寸

UIViewContentModeScaleAspectFill

缩放内容以填充视图的大小。 内容的某些部分可能会被剪辑以填充视图的边界。

所以你的select是使用

  • UIViewContentModeScaleToFill ,并可能改变显示图像的宽高比,
  • UIViewContentModeScaleAspectFill ,并在您的PFImageView上使用clipToBounds = YES来剪辑图像的部分越界。

您可以参考其他职位的答案,这给你清晰的见解 – https://stackoverflow.com/a/14220605/3021573