在 Swift 中使用可视化格式通过约束格式化 TextViews



我尝试使用视觉格式向两个 TextView 添加约束,如下所示:

func addElements() {
    var questionText = UITextView(frame: CGRect())
    questionText.backgroundColor = UIColor.orangeColor()
    questionText.text = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam "
    questionText.editable = false
    self.view.addSubview(questionText)
    questionText.setTranslatesAutoresizingMaskIntoConstraints(false)
    var aText = UITextView(frame: CGRect())
    aText.backgroundColor = UIColor.purpleColor()
    aText.text = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam "
    aText.editable = false
    self.view.addSubview(aText)
    questionText.setTranslatesAutoresizingMaskIntoConstraints(false)
    var viewDict = Dictionary<String, UIView>()
    viewDict["questionText"] = questionText
    viewDict["aText1"] = aText
    self.view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-[questionText]-|", options: nil, metrics: nil, views: viewDict))
    self.view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-[aText1]-|", options: nil, metrics: nil, views: viewDict))
    self.view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-[questionText]-[aText1]-|", options: nil, metrics: nil, views: viewDict))

但是当我编译此代码时,iPhone屏幕仍然是空白的。我能够通过添加高度和宽度值来显示"问题文本",但这不适用于 aText1。Shoudlnt Swift 无法确定正确的高度和宽度,例如,当我写"|-[elem]-|"时,它会自动假设"elem"具有最大大小?还是我错过了什么?这是通过导航到主屏幕创建的控制台输出片段:

"<NSLayoutConstraint:0x7ff3e3f242f0 UITextView:0x7ff3e4885c00'Lorem ipsum dolor...'.leading == UIView:0x7ff3e3e422f0.leadingMargin>",
"<NSLayoutConstraint:0x7ff3e3f24370 UIView:0x7ff3e3e422f0.trailingMargin == UITextView:0x7ff3e4885c00'Lorem ipsum dolor...'.trailing>",

但是,像以下示例所示添加多个元素完全没有问题:

func addElements() {
    var questionText = UITextView(frame: CGRect())
    questionText.backgroundColor = UIColor.orangeColor()
    questionText.text = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam"
    questionText.editable = false
    self.view.addSubview(questionText)
    questionText.setTranslatesAutoresizingMaskIntoConstraints(false)
    var checkBox1 = CheckBox(frame: CGRect(), selected: false)
    checkBox1.mDelegate = self
    checkBox1.tag = 1337
    self.view.addSubview(checkBox1)
    checkBox1.setTranslatesAutoresizingMaskIntoConstraints(false)
    var checkBox2 = CheckBox(frame: CGRect(), selected: false)
    checkBox2.mDelegate = self
    checkBox2.tag = 1337
    self.view.addSubview(checkBox2)
    checkBox2.setTranslatesAutoresizingMaskIntoConstraints(false)
    var viewDict = Dictionary<String, UIView>()
    viewDict["questionText"] = questionText
    viewDict["check1"] = checkBox1
    viewDict["check2"] = checkBox2
    self.view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-[questionText]-|", options: nil, metrics: nil, views: viewDict))
    self.view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-[check1]-[check2]", options: nil, metrics: nil, views: viewDict))
    self.view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-[questionText]-[check1]-|", options: nil, metrics: nil, views: viewDict))
    self.view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-[questionText]-[check2]-|", options: nil, metrics: nil, views: viewDict))

复选框是 UIButton 的一个子类。

最后,我会撒谎,以便能够创建一个视图,顶部有一个文本视图,在同一

行上有多个复选框和文本视图,在它下面。

一个问题是你看起来有一个剪切和粘贴错误——你有questionText.setTranslatesAutoresizingMaskIntoConstraints(false)你应该aText.setTranslatesAutoresizingMaskIntoConstraints(false)的地方。如果修复此问题,您应该会看到两个文本视图之一,但是...

垂直约束的 VFL 字符串不会告诉系统两个文本视图的相对大小应该是多少,

"V:|-[questionText]-[aText1]-|"

试试这个,这应该使两个文本视图的大小相同,

"V:|-[questionText]-[aText1(==questionText)]-|"

或类似的东西,给其中一个一个高度,

"V:|-[questionText(==200)]-[aText1]-|"

带有复选框的第二组约束有效,因为按钮具有固有的内容大小,而文本视图(和纯 UIViews)则不然。在这种情况下,按钮会占用其固有大小所说的任何内容,而文本视图会占用其余空间(减去填充)。

最新更新