首页 > 解决方案 > 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
    }
}

这就是我的自定义视图在故事板中的样子

在此处输入图像描述

这就是我的自定义视图在应用程序运行时的样子,缺少背景,我无法与按钮或文本视图交互。我读过这是因为我的内容超出了我的框架。我希望框架自动围绕我的所有内容放置,但我不想指定框架的大小和位置。

在此处输入图像描述

标签: iosswift

解决方案


如果您只是以编程方式或使用 segue在模态视图控制器中显示视图,您将有一个更轻松的时间。

将您的视图复制到新的视图控制器并以模态方式呈现该视图控制器。如果您使用 segue 这样做,则需要在preformSegue 函数uid中设置视图控制器的。否则,您将在显示视图控制器的位置设置它。您可以处理该视图控制器内的按钮点击。

如果默认情况下这不能实现您想要的外观(浮动视图),您可以将新视图控制器的视图设置为清晰,并在其中心锚定一个较小的视图(您已经定义的视图)。

作为旁注,我建议将您的课程重命名为,ReportUserView因为它不是UIWindow. 它是一个UIView,这就是你想要的。Windows 在 iOS 中有些不同。您通常只有一个,并且只处理其中的视图和控制器。


推荐阅读