UIImageView 中的 UIImage 位置偏移

Posted

技术标签:

【中文标题】UIImageView 中的 UIImage 位置偏移【英文标题】:UIImage position shifting in UIImageView 【发布时间】:2016-06-09 21:19:32 【问题描述】:

我在情节提要中有一个 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 中。

【问题讨论】:

如果您提供 MCVE ***.com/help/mcve,我们很乐意为您提供帮助 UIImageView 在其父级中是如何被约束的? 图像视图是水平堆栈视图的最左侧元素,被限制为相同高度且位于左边缘。我在自己的脑海中苦苦挣扎,以了解其中任何一个如何相关-并不是说这不是一个好问题-仅仅是因为我能找到的唯一变量是图像是来自网络还是来自资产目录.将文件从网络上保存并放入资产目录中的实验似乎表明这是真的。就 MCVE 而言,我发现很难剥离应用程序以便以小形式进行测试,但会尝试。 想法如何在 MCVE 中包含故事板? 发布一个完整的精简项目。所有文件,包括故事板。人们经常使用 github,但您可以使用 Dropbox 或其他任何可行的方法。 【参考方案1】:

问题原来是由表格视图单元完成的自动布局功能,正如here 所讨论的那样。我已将故事板中图标的视图大小明确设置为 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 也只是妄想症。)

【讨论】:

以上是关于UIImageView 中的 UIImage 位置偏移的主要内容,如果未能解决你的问题,请参考以下文章

如何在 UIImageView 中获取 UIImage 的 x 和 y 位置?

如何在“方面填充”模式下将 UIImageView 裁剪为新的 UIImage?

如何在“方面填充”模式下将 UIImageView 裁剪为新的 UIImage?

iOS 9.3 中的 UIImageView 如何渲染 UIImage?

iPhone 编程:如何使 UIImageView 中的 UIImage 以实际大小显示?

当动画 UIImage 被分配两次时,UITableViewCell 中的 UIImageView 没有动画