0

我在情节提要中有一个 UIImageView,我将来自两个来源之一的 UIImage 存储到其中 - 我要么从网络加载图像,要么从本地资产目录加载图像。在所有情况下,通过检查,图像都​​是 48x48;图像视图恰好是 50x50。除了获取图像的代码(通过 Alamofire+AlamofireImage 或 UIImage:named),其余代码是相同的。加载时的图像,通过在 lldb 中的检查,两个来源都是 48x48。

我看到的行为是从网络加载的图像在图像视图中正确居中显示。但是,从资产目录加载的那些会向右移动,并且无论我在图像视图上设置的内容模式如何(我都尝试过),它们都会如此移动。整个局部图像被移动,使得左边缘不与图像视图的左边缘对齐 - 它大致位于中心。作为实验,我捕获了一张网络图像并将其存储在目录中;它在显示时也发生了变化,这让我得出结论,问题不在于图像本身。

我的问题是:在这两种情况下——我从网络加载的 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) }

最后,将图像放入 UI 的代码,这两个路径都通用,是:

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

我捕获文件并从资产目录中尝试它的实验使我确信文件内容不是问题(尽管我愿意被显示错误!) - 某些原因导致本地加载的图像在风景。

该应用程序适用于 iPhone。我正在测试最新的 Xcode/iOS;该应用程序在 Swift 中。

4

1 回答 1

0

问题原来是由表格视图单元完成的自动布局的功能,如此所述。我已将故事板中图标的视图大小明确设置为 50x50,因此表格单元类中的此覆盖为我解决了问题:

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 也只是妄想症。)

于 2016-06-15T18:40:38.743 回答