Swift 4中如何让子视图的背景图片铺满整个UIView?
解决ScrollView上方UIView背景图片无法铺满的问题
我来帮你搞定这个背景图片铺满的问题!你现在遇到的情况,核心原因是你把UIImageView的frame直接设成了UIScreen.main.bounds,但你的目标UIView(也就是my_vi)的尺寸不一定和屏幕完全一致,而且当ScrollView滚动时,这个固定frame的图片不会跟着UIView的布局动态调整,所以才会出现只有滚动到底部才看到完整图片的情况。
下面给你两个可行的解决方案,优先推荐第一种(Auto Layout),适配性更好:
方案一:使用Auto Layout(推荐)
这种方式能让图片自动贴合父视图的边界,不管父视图尺寸怎么变化都能铺满:
- 初始化UIImageView时不要设置固定frame,直接用图片初始化(或者空初始化):
let backgroundImage = UIImageView(image: UIImage(named: "background_image")) - 关闭自动调整尺寸的旧机制,开启Auto Layout支持:
backgroundImage.translatesAutoresizingMaskIntoConstraints = false - 设置图片的填充模式,这里推荐用
scaleAspectFill(能保持图片比例同时铺满视图,不会拉伸变形;如果不需要保持比例,也可以用scaleToFill):backgroundImage.contentMode = .scaleAspectFill backgroundImage.clipsToBounds = true // 超出视图的部分裁剪掉 - 将图片视图添加到目标UIView,并添加约束让它完全铺满父视图:
self.my_vi.addSubview(backgroundImage) // 激活约束 NSLayoutConstraint.activate([ backgroundImage.topAnchor.constraint(equalTo: self.my_vi.topAnchor), backgroundImage.leadingAnchor.constraint(equalTo: self.my_vi.leadingAnchor), backgroundImage.trailingAnchor.constraint(equalTo: self.my_vi.trailingAnchor), backgroundImage.bottomAnchor.constraint(equalTo: self.my_vi.bottomAnchor) ]) - 最后记得把背景图片放到视图层级的最底层,避免遮挡其他控件:
self.my_vi.sendSubviewToBack(backgroundImage)
方案二:使用Frame(适配性较差,不推荐)
如果坚持要用frame来设置,需要让图片视图随父视图尺寸变化自动调整:
- 把UIImageView的frame设为目标UIView的bounds,而不是屏幕的bounds:
let backgroundImage = UIImageView(frame: self.my_vi.bounds) - 设置自动调整掩码,让图片视图的宽高随父视图变化:
backgroundImage.autoresizingMask = [.flexibleWidth, .flexibleHeight] - 同样设置填充模式和裁剪:
backgroundImage.clipsToBounds = true backgroundImage.image = UIImage(named: "background_image") backgroundImage.contentMode = .scaleAspectFill // 或.scaleToFill - 添加到父视图并放到底层:
self.my_vi.addSubview(backgroundImage) self.my_vi.sendSubviewToBack(backgroundImage)
额外注意点
- 确保你的
my_vi的尺寸设置正确:如果它是ScrollView的子视图,要确认ScrollView的contentSize已经正确设置,或者用Auto Layout让ScrollView自动计算内容尺寸,这样my_vi的高度才会符合你的预期。 - 如果你用的是Storyboard/XIB,也可以直接在界面里添加UIImageView,设置约束和contentMode,效果是一样的。
内容的提问来源于stack exchange,提问作者Enamul Haque
相关产品推荐
相关产品推荐

