2015-05-06 8 views
19

Próbuję pokazać listę nazwy miejsca, w tym jego zdjęcie, używając PFQueryTableViewController. Jest on zawarty w ParseUI SDK od parse.comDlaczego skalowanie do wypełnienia daje większy obraz niż rozmiar UIImageVIew? (używając szybkiego)

Udało mi się pokazać obraz. Niestety, kiedy zmieniam tryb UIImageView na Aspect fill, obraz staje się większy niż powinien.

tutaj są zdjęcia:

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

w pic_normal, widać dwie komórki, z dwoma normalnego obrazu. w pic_error, druga komórka zostanie nałożona na pierwszy obraz komórki.

Czy ktoś może mi pomóc rozwiązać ten problem? Włożyłem też cały mój kod tutaj:

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

} 
+0

markę tryb UIImageView aspektu pasują –

+0

Chcę wypełnić UIImageView, ale również zachować aspekt stosunek. – Gibran

+1

Skorzystaj z tej odpowiedzi, wiesz różnicę między wypełnieniem aspektu a dopasowaniem aspektu http://stackoverflow.com/questions/4895272/difference-between-uiviewcontentmodescaleaspectfit-and-uiviewcontentmodes_aletof –

Odpowiedz

59

W trybie zawartości ustawionym na Aspect Fill, spróbuj ustawić pliki do granic true, jak również, powodem jest tryb zawartość aspect fill utrzymuje się na wypełnienie kadru widoku obrazu aż ramka jest całkowicie wypełniona treścią również utrzymanie aspect ratio nienaruszony. W procesie napełniania pojemnika z zachowaniem proporcji obrazu, pionowa lub pozioma rama jest całkowicie wypełniona, a napełnianie jest kontynuowane do momentu pełnego wypełnienia drugiej (jeśli pozioma niż pionowa lub vice versa). Tak więc pierwsza wypełniona część albo w pionie, albo w poziomie wyjdzie poza granice, a treść będzie widoczna poza ramką widoku obrazu.Aby przyciąć dodatkową zawartość musimy przyciąć dodatkową porcję korzystając ImageView za zestaw clipsToBounds własności do true

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

Dzięki człowieku, zajęło mi to dużo czasu ... –

4

Jeśli chcesz zachować proporcje z różnej szerokości, a następnie użyć AspectFill a także skorzystać z clipstoBounds własności ImageView, nie będzie szerzyć ImageView poza ramy

+0

tego właśnie szukam. Dziękuję bardzo! – Gibran

2

Od apple doc:

UIViewContentModeScaleToFill

Wagi zawartość, aby dopasować wielkość się poprzez zmianę stosunku zawartości obrazu razie potrzeby

UIViewContentModeScaleAspectFill

wagi zawartości do wypełnienia rozmiaru widoku. Część zawartości może zostać obcięta w celu wypełnienia granic widoku.

więc opcje są do korzystania

  • UIViewContentModeScaleToFill i ewentualnie zmienić proporcji wyświetlanego obrazu,
  • UIViewContentModeScaleAspectFill i używać clipToBounds = YES na swojej PFImageView, klip fragmenty obrazu poza granicami .
8

Alternatywnie dla facetów, którzy preferują Interfejs Builder, można sprawdzić Clip Subviews w widoku obrazu po wybraniu Aspect Fill, to nie zmieni rozmiaru twojego zdjęcia, ale nadal zachowa ten sam współczynnik proporcji.

enter image description here

1

enter image description here

referencyjny: odpowiedź w innym poście, który daje jasny wgląd - https://stackoverflow.com/a/14220605/3021573

+0

Czy to nie może być komentarz pod pytaniem? Tak naprawdę nie dostarczyłeś odpowiedzi, a jedynie referencję. Tam ludzie zwykle robią niewielkie, pomocne wkłady, które tak naprawdę nie kwalifikują się jako odpowiedzi techniczne dostarczone przez plakat. – clearlight

+0

Przepraszamy za to, ale odpowiedź jest naprawdę długa. Ponadto uważam, że lepiej, aby kredyt pozostał dla osoby, która to napisała. Jestem nowy, aby przepełnić stos. proszę zasugeruj, co mogę teraz zrobić. –

+0

@AvinashB Możesz po prostu odwołać się do artykułu bezpośrednio, zamiast odpowiedzi. W ten sposób nadal zachowujesz kredyty dla autora. Jeszcze lepiej byłoby: wyodrębnić ważne części z artykułu do swojej odpowiedzi tutaj na SO i wspomnieć źródło twoich informacji. – Korayem

Powiązane problemy