Почему масштаб для заполнения дает большее изображение, чем размер UIImageVIew? (с использованием быстрого)
Я пытаюсь показать список имени места, включая его фотографию, используя PFQueryTableViewController
. Он включен в SDK ParseUI из parse.com
Мне удалось показать изображение. К сожалению, когда я изменяю режим UIImageView на Аспект заполнения, изображение становится больше, чем должно быть.
вот фотографии:
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()
}
}
Ответы
Ответ 1
С режимом содержимого, установленным на Aspect Fill
, попробуйте установить для клипов также значение true, потому что режим содержимого Aspect Fill
продолжает заполнять рамку изображения, пока кадр не будет полностью заполнен содержимым, также сохраняя aspect ratio
нетронутым. В процессе наполнения контейнера пропорцией сохранения изображения вертикальная или горизонтальная рама полностью заполняется, и заполнение продолжается до тех пор, пока не будет полностью заполнена часть (если горизонтальная, чем вертикальная или наоборот). Таким образом, первая заполненная часть либо по вертикали, либо по горизонтали выйдет за пределы, и контент будет виден вне рамки изображения. Чтобы скопировать дополнительный контент, нам нужно закрепить дополнительную порцию, используя свойство imageView clipsToBounds
, установленное в true
cell.photo.contentMode = UIViewContentMode.ScaleAspectFill
cell.photo.clipsToBounds = true
Ответ 2
В качестве альтернативы для парней, которые предпочитают Interface Builder, вы можете проверить Clip Subviews
в своем представлении изображения, когда вы выберете Aspect Fill
, тогда он не изменит размер вашего изображения. > но все равно сохраняют одинаковое соотношение сторон.
![введите описание изображения здесь]()
Ответ 3
Если вы хотите сохранить соотношение сторон с разной шириной, используйте AspectFill, а также используйте свойство imageview clipstoBounds, оно не будет распространять изображение за рамкой
Ответ 4
Из apple doc:
UIViewContentModeScaleToFill
Масштабирует содержимое, чтобы оно соответствовало самому размеру, изменяя аспект отношение содержимого при необходимости
UIViewContentModeScaleAspectFill
Масштабирует содержимое, чтобы заполнить размер представления. Некоторая часть содержимое может быть обрезано, чтобы заполнить границы представлений.
Итак, ваши варианты использования
-
UIViewContentModeScaleToFill
и, возможно, изменить соотношение сторон отображаемого изображения,
-
UIViewContentModeScaleAspectFill
и используйте clipToBounds = YES
на PFImageView
, чтобы скопировать фрагменты изображения за пределы.
Ответ 5
Вы можете ссылаться на ответ в другом сообщении, который дает вам четкое представление - fooobar.com/info/19572/...