UIImageView 中的 UIImage 位置偏移
UIImage position shifting in UIImageView
我在故事板中有一个 UIImageView,我将来自两个来源之一的 UI 图像存储到其中 - 我从网络或本地资产目录加载图像。在所有情况下,通过检查,图像都是 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.
问题原来是由 table 视图单元完成的自动布局功能引起的,正如 here 所讨论的那样。我已经在故事板中明确地将图标的视图大小设置为 50x50,因此 table 单元格 class 中的这个覆盖为我解决了这个问题:
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也只是偏执狂。)
我在故事板中有一个 UIImageView,我将来自两个来源之一的 UI 图像存储到其中 - 我从网络或本地资产目录加载图像。在所有情况下,通过检查,图像都是 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.
问题原来是由 table 视图单元完成的自动布局功能引起的,正如 here 所讨论的那样。我已经在故事板中明确地将图标的视图大小设置为 50x50,因此 table 单元格 class 中的这个覆盖为我解决了这个问题:
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也只是偏执狂。)