为何必须为UIImageView定义frame?仅设置center为何不显示?
嘿,这个问题我当初刚接触UIKit手动布局的时候也懵过!咱们一步步拆解来看:
核心原因:UIView的显示依赖「尺寸+位置」的完整定义
UIKit里的任何视图要能被看到,必须同时具备明确的尺寸和在父视图中的位置。frame其实是把这两个信息打包在一起了——它包含了视图在父坐标系中的原点(位置)和宽高(尺寸)。
而center仅仅是视图的中心点位置,它本身不会定义视图的尺寸。当你只设置center却没指定尺寸时,UIImageView的默认bounds.size是(0, 0)——相当于一个看不见的点,哪怕你给它赋值了image,也没有可显示的区域,自然就看不到了。
为什么设置frame就能正常显示?
你初始化时写的UIImageView(frame:CGRect(x:10, y:50, width:100, height:300)),其实是同时完成了两件事:
- 给视图设置了宽高(
bounds.size被设为(100,300)) - 基于frame的原点和尺寸,自动计算出了
center的值(center = frame.origin + frame.size/2)
这时候视图既有尺寸又有位置,image就能在这个区域里正常渲染了。
你说的「imageView已知晓自身宽高」是怎么回事?
没错,当你给UIImageView赋值image后,它会获得一个intrinsicContentSize(就是图片本身的尺寸),但默认情况下UIKit不会自动把这个 intrinsic size 应用到视图的frame上——这是手动布局(frame布局)的规则:你必须明确告诉视图它的尺寸,否则它就用默认的(0,0)。
那如果不想用frame,怎么通过设置center让图片显示?
有两种办法:
1. 手动把bounds.size设为图片尺寸
先拿到图片的size,给UIImageView的bounds.size赋值,再设置center:
var imageView = UIImageView() if let testImage = UIImage(named:"Test.jpeg") { imageView.image = testImage // 手动设置视图尺寸为图片尺寸 imageView.bounds.size = testImage.size } // 设置中心点位置 imageView.center = CGPoint(x: self.view.bounds.midX, y: self.view.bounds.midY) self.view.addSubview(imageView)
2. 改用Auto Layout
如果用Auto Layout,只需要设置center的约束,系统会自动使用UIImageView的intrinsicContentSize作为尺寸:
var imageView = UIImageView() imageView.image = UIImage(named:"Test.jpeg") // 关掉自动将frame转换为约束的开关 imageView.translatesAutoresizingMaskIntoConstraints = false self.view.addSubview(imageView) // 添加中心点约束 NSLayoutConstraint.activate([ imageView.centerXAnchor.constraint(equalTo: self.view.centerXAnchor), imageView.centerYAnchor.constraint(equalTo: self.view.centerYAnchor) ])
这样不用写frame,图片也能正常显示在你想要的中心点位置啦!
内容的提问来源于stack exchange,提问作者Ninja

