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 高度无法跨设备正确缩放图像的主要内容,如果未能解决你的问题,请参考以下文章
带有 viewBox 和宽度的 SVG 在 IE 中无法正确缩放高度