我需要为iPhone制作一个通用的弹出框,将其大小调整为所呈现视图的大小。所以我创建了一个ViewController子类来处理所有的表示逻辑:
class PopoverViewController: UIViewController, UIPopoverPresentationControllerDelegate {
var contentView = UIView()
init(contentView: UIView, sourceView: UIView) {
super.init(nibName: nil, bundle: nil)
self.contentView = contentView
view = contentView
preferredContentSize = view.bounds.size
modalPresentationStyle = .popover
guard let controller = popoverPresentationController else {return}
controller.permittedArrowDirections = .up
controller.delegate = self
controller.sourceView = sourceView
controller.sourceRect = sourceView.bounds
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
extension PopoverViewController: UIAdaptivePresentationControllerDelegate {
func adaptivePresentationStyle(for controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle {
return .none
}
}
它的大小和一切都很好,然后我设置preferredContentSize一个特定的框架(如320x260等)
但是当我将其设置为呈现的控制器的视图框或边界大小时,popover呈现默认大小:
我试图通过打印来检查contentView框架,结果发现它的宽度和高度都为零。ContentView布局代码:
override init(frame: CGRect) {
super.init(frame: frame)
backgroundColor = .white
addSubview(titleLabel)
addSubview(contentLabel)
titleLabel.snp.makeConstraints { make in
make.top.equalToSuperview().offset(appearance.xlSpace)
make.leading.trailing.equalToSuperview().inset(appearance.xlSpace)
}
contentLabel.snp.makeConstraints { make in
make.top.equalTo(titleLabel.snp.bottom).offset(appearance.lSpace)
make.leading.trailing.equalToSuperview().inset(appearance.sSpace)
make.bottom.equalToSuperview().inset(appearance.xsSpace)
}
print("width: \(self.bounds.width), height: \(self.bounds.height)")
}
演示代码:
func showInfo() {
let view = PopupView()
let controller = PopoverViewController(contentView: view, sourceView: contentView.infoButton)
present(controller, animated: true, completion: nil)
}
我如何正确地设置我的popover控制器preferredContentSize来查看框架大小,并使其通用于呈现任何传入控制器的视图?
1条答案
按热度按时间imzjd6km1#
我相信问题是你设置
preferredContentSize
属性太早了。尝试在viewWillAppear
中执行此操作。当调用init时,我不认为一切都已经正确地设置和布局了。