ios - Swift:创建自定义视图而不指定框架大小
问题描述
我有一个自定义视图。我正在尝试添加此自定义视图并将其置于我的 ViewController 中。我在情节提要中创建了视图,但正在以编程方式将其添加到我的 ViewController 中。init 函数要求我给出一个框架。我不想指定一个框架,因为我希望根据视图控制器中的内容自动调整视图大小,然后我只想使用我的约束使视图居中。
这是我用于添加自定义视图的视图控制器中的代码
let reportWindow = ReportWindow(user: self.uid!, frame: CGRect(x: 0, y: 0, width: 100, height: 100))
self.view.addSubview(reportWindow)
let centerX = NSLayoutConstraint(item: reportWindow, attribute: .centerX, relatedBy: .equal, toItem: self.view, attribute: .centerX, multiplier: 1, constant: 0)
let centerY = NSLayoutConstraint(item: reportWindow, attribute: .centerY, relatedBy: .equal, toItem: self.view, attribute: .centerY, multiplier: 1, constant: 0)
NSLayoutConstraint.activate([centerX, centerY])
这是我的自定义视图类的代码
class ReportWindow: UIView{
var uid: String
@IBOutlet weak var title: UILabel?
@IBOutlet weak var textView: UITextView!
@IBOutlet weak var contentView: UIView!
init(user uid: String, frame: CGRect) {
self.uid = uid
super.init(frame: frame)
commonInit()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
@IBAction func cancel(_ sender: UIButton) {
self.removeFromSuperview()
}
@IBAction func confirm(_ sender: UIButton) {
self.removeFromSuperview()
}
}
extension ReportWindow{
func commonInit() {
let view = loadViewFromNib()
view.frame = bounds
view.autoresizingMask = UIView.AutoresizingMask(rawValue: UIView.AutoresizingMask.RawValue(UInt8(UIView.AutoresizingMask.flexibleWidth.rawValue) | UInt8(UIView.AutoresizingMask.flexibleHeight.rawValue)))
self.addSubview(view)
textView.delegate = self
textView.textAlignment = .center
self.translatesAutoresizingMaskIntoConstraints = false
}
func loadViewFromNib() -> UIView {
let bundle = Bundle(for: type(of: self))
let nib = UINib(nibName: "ReportWindow", bundle: bundle)
let view = nib.instantiate(withOwner: self, options: nil)[0] as! UIView
return view
}
}
这就是我的自定义视图在故事板中的样子
这就是我的自定义视图在应用程序运行时的样子,缺少背景,我无法与按钮或文本视图交互。我读过这是因为我的内容超出了我的框架。我希望框架自动围绕我的所有内容放置,但我不想指定框架的大小和位置。
解决方案
如果您只是以编程方式或使用 segue在模态视图控制器中显示视图,您将有一个更轻松的时间。
将您的视图复制到新的视图控制器并以模态方式呈现该视图控制器。如果您使用 segue 这样做,则需要在preformSegue 函数uid
中设置视图控制器的。否则,您将在显示视图控制器的位置设置它。您可以处理该视图控制器内的按钮点击。
如果默认情况下这不能实现您想要的外观(浮动视图),您可以将新视图控制器的视图设置为清晰,并在其中心锚定一个较小的视图(您已经定义的视图)。
作为旁注,我建议将您的课程重命名为,ReportUserView
因为它不是UIWindow
. 它是一个UIView
,这就是你想要的。Windows 在 iOS 中有些不同。您通常只有一个,并且只处理其中的视图和控制器。
推荐阅读
- r - 当字符串带有空格时,agrep 不起作用,用于字符串匹配
- sql - 每个组的本地最大值的 SQL 排序结果
- android - java.lang.NullPointerException:尝试插入到 Telephony.Sms.Conversations 时,Uri 不能为空
- mysql - 如何在 Django 模型中声明 JSON 字段?
- azure - 部署到存储帐户的静态网站的正确 scm?
- c++ - 为生成的代码扩展 C++ 模板参数类型名称
- python - 有没有办法让这个反向阶乘代码更有效地运行
- sql-server - 直到使用 PlatformTransactionManager 完成事务后才提交插入
- javascript - 等待/异步不等待承诺
- c++ - 为什么 std::reduce 需要可交换性?