2016-06-09 79 views
0

我在故事板中有一個UIImageView,我從兩個來源之一存儲UIImages - 我從網絡或本地資產目錄加載圖像。在所有情況下,通過檢查,圖像是48×48;圖像視圖恰好是50x50。除了獲取圖像的代碼(通過Alamofire + AlamofireImage或UIImage:named)之外,其餘代碼都是相同的。加載圖像時,通過lldb檢查,兩個來源都是48x48。在UIImageView中移動UIImage位置

我看到的行爲是從網絡加載的圖像正確顯示在圖像視圖中居中。然而,從資產目錄加載的資源會被移到右側,並且無論我在圖像視圖上設置的內容模式如何移動(我都嘗試過)。整個局部圖像被移動,使得左邊緣不與圖像視圖的左邊緣對齊 - 它大致位於中心。作爲一個實驗,我捕獲了一個網絡圖像並將其存儲在目錄中;它在顯示時也被轉移,導致我得出結論,問題不在於圖像本身。

我的問題是:在兩種情況下 - 我從網上加載的48x48圖像與從資產目錄加載的相同圖像之間有什麼不同 - 導致本地加載的圖像向右移動?

這是從資產目錄加載代碼:

image = UIImage(named: iconString) 

我也試過這樣:

image = UIImage(named: iconString)?.imageWithAlignmentRectInsets(UIEdgeInsetsMake(0, 0, 0, 9)) 

,但它並沒有區別。

的Alamofire/AlamofireImage代碼同樣簡單:

let request = Alamofire.request(.GET, url) 
    .validate() 
    .responseImage { response in completion?(result: response.result.value) } 

,最後,代碼把圖像到用戶界面,通用於兩個路徑,是:

cell.imageView?.image = fcsts.first!.icon 

實驗我確實捕獲了這個文件,並從資產目錄中嘗試了它,說服了我文件內容不是問題(儘管我願意被錯誤地顯示出來!) - 某些情況導致本地加載的圖像在視圖中偏移。

該應用程序適用於iPhone。我正在測試最新的Xcode/iOS;該應用程序是在斯威夫特。

+0

如果您提供MCVE,很樂意提供幫助http://stackoverflow.com/help/mcve –

+0

UIImageView如何被約束在其父母之內? –

+0

圖像視圖是水平堆棧視圖的最左邊元素,被限制爲具有相同的高度和左邊緣。我在自己的頭腦中掙扎着想要理解其中的任何一個可能是相關的 - 而不是它不是一個好問題 - 僅僅因爲我能找到的唯一變量是圖像是從網絡進入還是從資產目錄進入。實驗將文件保存在網絡上並將其放置在資產目錄中似乎表明這是事實。就一個MCVE而言,我發現很難將應用程序剝離爲小型可測試的,但會嘗試。 – Feldur

回答

0

問題原來是由表格視圖單元完成的自動佈局功能,如討論的here。我已經明確地設置圖標的視圖大小在我的故事板是50×50,所以這種替代在表格單元格類固定的問題對我來說:

override func layoutSubviews() { 
    super.layoutSubviews() 
    if let rect = self.imageView?.frame { 
     var newRect = rect 
     newRect.origin = CGPointMake((50-rect.size.width)/2, (50-rect.size.height)/2) 
     self.imageView!.frame = newRect 
    } 
} 

我爲什麼複製圖像與網絡斷開連接到一個沒有解釋本地文件導致它受到重新定位的影響,也不知道爲什麼錯誤的定位僅在水平方向上,即使所涉及的所有大小都是對稱的。 (是的,如果我只調整X的位置,它確實工作;調整Y也只是偏執狂。)