为啥缩放以填充比 UIImageVIew 尺寸更大的图像? (使用快速)
Posted
技术标签:
【中文标题】为啥缩放以填充比 UIImageVIew 尺寸更大的图像? (使用快速)【英文标题】:Why scale to fill give bigger image than UIImageVIew size? (using swift)为什么缩放以填充比 UIImageVIew 尺寸更大的图像? (使用快速) 【发布时间】:2015-05-06 09:45:59 【问题描述】:我正在尝试显示地名列表,包括使用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()
【问题讨论】:
将 UIImageView 模式设置为 Aspect Fit 我要填充UIImageVIew,但也要保持纵横比。 参考这个答案你就知道aspect fill和aspect fit的区别***.com/questions/4895272/… 当所有 UIViewContentModes 都无法解决时,这个答案对我有帮助。 - ***.com/a/35685883/8694980 【参考方案1】:将内容模式设置为Aspect Fill
,尝试将剪辑的边界设置为true,原因是内容模式aspect fill
不断填充图像视图的框架,直到框架完全充满内容,同时保持aspect ratio
完好无损。在以图像保持纵横比填充容器的过程中,垂直或水平框架被完全填充,并继续填充直到另一个(如果水平而不是垂直或反之亦然)部分被完全填充。因此,垂直或水平方向的第一个填充部分将超出范围,并且内容将在图像视图的框架之外可见。要剪辑额外的内容,我们需要使用 imageView 的 clipsToBounds
属性设置为 true
来剪辑额外的部分
cell.photo.contentMode = UIViewContentMode.ScaleAspectFill
cell.photo.clipsToBounds = true
【讨论】:
【参考方案2】:参考:另一篇文章中的答案可以让您清楚地了解 - https://***.com/a/14220605/3021573
【讨论】:
这不是问题下方的评论吗?您还没有真正提供答案,而只是一个参考。这就是人们通常会做出小的有益贡献的地方,这些贡献并不真正符合海报提供的技术答案。 很抱歉,但答案真的很长。另外,认为最好还是把功劳留给写那篇文章的人。我是堆栈溢出的新手。请建议我现在可以做什么。 @AvinashB 您可以直接参考文章而不是答案。这样,您仍然可以保留作者的学分。更好的是:将文章中的重要部分提取到您在 SO 上的答案中,并提及您的信息来源。【参考方案3】:对于喜欢Interface Builder的人,您可以在选择Aspect Fill
时在您的图像视图中检查Clip Subviews
,然后它不会调整您的图像视图 但仍保持相同的纵横比。
【讨论】:
【参考方案4】:如果要保持不同宽度的纵横比,则使用 AspectFill 并使用 imageview 属性 clipstoBounds,它不会将 imageview 扩展到框架之外
【讨论】:
【参考方案5】:来自apple doc:
UIViewContentModeScaleToFill
通过更改纵横比来缩放内容以适应自身的大小 必要时内容的比例
UIViewContentModeScaleAspectFill
缩放内容以填充视图的大小。的一部分 内容可能会被剪裁以填充视图的边界。
所以你的选择是使用
UIViewContentModeScaleToFill
,可能会改变显示图像的纵横比,
UIViewContentModeScaleAspectFill
,并在您的PFImageView
上使用clipToBounds = YES
,将图像的某些部分剪裁出边界。
【讨论】:
以上是关于为啥缩放以填充比 UIImageVIew 尺寸更大的图像? (使用快速)的主要内容,如果未能解决你的问题,请参考以下文章