UIView 高度无法跨设备正确缩放图像

Posted

技术标签:

【中文标题】UIView 高度无法跨设备正确缩放图像【英文标题】:UIView height not properly scaling with image across devices 【发布时间】:2016-05-25 19:30:07 【问题描述】:

我正在开发一个应用程序,该应用程序使用选择器在基本颜色条中旋转。这些条应该与高度匹配,并位于背景图像宽度的特定位置。该图像是一个可缩放的矢量并设置为 Aspect Fit。图像还包含一些空白,因此不能简单地将条形设置为与图像完全相同的高度。为了创建条形图,我创建了一个简单的矩形 UIView 并根据需要设置背景颜色。选择器方法如下:

imageSize = AVMakeRectWithAspectRatioInsideRect(myImage.image!.size, myImage.frame)

func pickerView(pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusingView view: UIView?) -> UIView 

    let imageHeight = self.imageSize.height
    let imageWidth = self.imageSize.width

    let barWidth = imageWidth * 0.055

    var frame: CGRect

    switch component 
    case 1: // First component needs to match tan portions height
        let barHeight = imageHeight * 0.85

        frame = CGRect(x: -barWidth/2, y: -barHeight/2, width: barWidth, height: barHeight)
        break
    case 3, 4, 5: // another part of image has different height
        let barHeight = imageHeight * 0.64

        frame = CGRect(x: -barWidth/2, y: -barHeight/2, width: barWidth, height: barHeight)
        break
    default: // return empty views for spacers
        return UIView()
    


    let stripe = UIView(frame: frame)
    stripe.backgroundColor = getColor(component, row: row)
    return stripe


计算imageHeight我用了多种方法,都没有成功。我直接使用了myImage.image.size.height 以及AVMakeRectWithAspectRatioInsideRect。图像跨越设备的宽度。以下是部分图片的截图:

6S:

关于 6S Plus:

5S:

如您所见,该条与背景图像的浅褐色部分未正确对齐,此外,水平位置也已关闭。我曾认为使用百分比可以通过缩放保持正确对齐,但我想我错了。

有没有人有这方面的经验可以看出我做错了什么?

【问题讨论】:

如果您希望它等于图像高度,我不确定您是否应该使用let barHeight = imageHeight * 0.85。您应该使用大小类以编程方式进行研究。 为什么不使用自动布局?你从哪里得到 0.85 的计算结果?如果您想这样做,请执行let barHeight = screenHeight * 0.85 @RyanCollins 我不希望它完全等于图像高度。图像有一些我不需要匹配的空白。 您需要发布比上述更多的代码,这样社区才能确切地看到它是如何工作的以获得更好的答案。 @NikitaP 这些视图在选择器中并以编程方式完成。 IMAGE 的 0.85 与 6S 上的正确尺寸相匹配。我不明白你使用屏幕尺寸的逻辑。我是专门缩放到图像的条形 【参考方案1】:

我通过使用宽度的百分比作为条形的高度来进行缩放。这只是因为图像设置为 Aspect Fit 并且与屏幕的宽度相同。

这是一个丑陋的解决方案,仅对一组特定的应用程序有效。似乎图像大小与不同设备的比较不可靠,或者没有返回与不同设备相关的正确大小。我还没弄清楚为什么我原来的逻辑不起作用。

【讨论】:

以上是关于UIView 高度无法跨设备正确缩放图像的主要内容,如果未能解决你的问题,请参考以下文章

IOS 8 图像缩放和自动布局

如何在 Ionic 中使元素的高度等于其宽度?

带有 viewBox 和宽度的 SVG 在 IE 中无法正确缩放高度

如何以编程方式将 UIImageView 缩放到固定宽度和灵活高度?

如何使用固定宽度和自动布局正确缩放图像?

将 UIImages 高度缩放到 UIImageView 高度