如何解决Swift - 使用 AVMakeRect 在 UIScreen 的中心获取子视图控制器
我将一个 vc 作为孩子添加到另一个 vc。我需要使用 AVMakeRect
设置孩子的大小,使其小于屏幕但仍保持其比例。问题是孩子没有居中,它要么离屏幕很远,就好像孩子的中心在屏幕顶部,要么太低了。根据我是使用 UIScreen.main.bounds.w/h / 2
还是 CGPoint(x: UIScreen.main.bounds.midX,y: UIScreen.main.bounds.midY)
使用 vc.view.center = CGPoint(x: UIScreen.main.bounds.midX,y: UIScreen.main.bounds.midY)
的示例结果:
let vc = SomeVC()
var didSubviewsLayout = false
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
if !didSubviewsLayout {
didSubviewsLayout = true
addChild(vc)
view.addSubview(vc.view)
vc.didMove(toParent: self)
let screenWidth = UIScreen.main.bounds.width
let screenHeight = UIScreen.main.bounds.height
let horizontalPadding: CGFloat = 50
let paddedWidth = screenWidth - horizontalPadding
let insideRect = CGRect(x: 0,y: 0,width: paddedWidth,height: screenHeight) // also tried CGFloat.infinity
let avRect = AVMakeRect(aspectRatio: CGSize(width: 9,height: 16),insideRect: insideRect)
vc.view.frame.size.width = avRect.size.width
vc.view.frame.size.height = avRect.size.height
vc.view.center = CGPoint(x: screenWidth / 2,y: screenHeight / 2) // also tried CGPoint(x: UIScreen.main.bounds.midX,y: UIScreen.main.bounds.midY)
// vc.view.layoutIfNeeded() // same results with or without calling it
}
}
解决方法
这是我使用 Anchors 和主窗口使 vc 居中的唯一方法。我更愿意使用 CGRect
但 ...
if !didSubviewsLayout {
didSubviewsLayout = true
guard let window = UIApplication.shared.windows.first(where: \.isKeyWindow) else { return }
addChild(vc)
view.addSubview(vc.view)
vc.didMove(toParent: self)
let screenWidth = UIScreen.main.bounds.width
let horizontalPadding: CGFloat = 50
let paddedWidth = screenWidth - horizontalPadding
let insideRect = CGRect(x: 0,y: 0,width: paddedWidth,height: .infinity)
let avRect = AVMakeRect(aspectRatio: CGSize(width: 9,height: 16),insideRect: insideRect)
vc.view.translatesAutoresizingMaskIntoConstraints = false
vc.view.widthAnchor.constraint(equalToConstant: avRect.size.width).isActive = true
vc.view.heightAnchor.constraint(equalToConstant: avRect.size.height).isActive = true
// I use the window's Y and X here
vc.view.centerYAnchor.constraint(equalTo: window.centerYAnchor).isActive = true
vc.view.centerXAnchor.constraint(equalTo: window.centerXAnchor).isActive = true
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。