2016-06-09 90 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也只是偏执狂。)