Swift - ограничить UITextView - PullRequest
1 голос
/ 16 января 2020

У меня есть UITextView, и я хотел бы ограничить его так же, как я бы UILabel. Но если я использую тот же constrains, что и с UILabel, я получаю другой результат. Я также не совсем понимаю, как работает UITextView.frame, потому что не имеет значения, что я установил height/width, результат остается прежним.

На картинке ниже "LinkTest" - мой UITextView. Как вы можете видеть, он не совпадает с UILabels ниже, хотя я constrain это то же самое.

enter image description here

UITextView:

    let linkLabel: UITextView = {
        let v = UITextView()
        v.backgroundColor = .clear
        v.text = "Link"
        v.textColor = .lightGray
        v.font = UIFont(name: "AvenirNext-Regular", size: 18)
        v.textAlignment = .right
        v.isSelectable = false
        v.isScrollEnabled = false
        v.frame = CGRect(x: 0, y: 0, width: 20, height: 20)
//        v.attributedText = NSAttributedString(string: "", attributes: [.underlineStyle: NSUnderlineStyle.single.rawValue])
        v.translatesAutoresizingMaskIntoConstraints = false
        return v
    }()

Ограничения:

// constrain linkLabel
    linkLabel.topAnchor.constraint(equalTo: linkImage.topAnchor).isActive = true
    linkLabel.leadingAnchor.constraint(equalTo: linkImage.leadingAnchor, constant: 30).isActive = true
    linkLabel.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -20).isActive = true

    // constrain priceLabel
    priceLabel.topAnchor.constraint(equalTo: linkLabel.topAnchor, constant: 35).isActive = true
    priceLabel.leadingAnchor.constraint(equalTo: linkImage.leadingAnchor, constant: 30).isActive = true
    priceLabel.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -20).isActive = true

    // constrain noteLabel
    noteLabel.topAnchor.constraint(equalTo: priceLabel.topAnchor, constant: 35).isActive = true
    noteLabel.leadingAnchor.constraint(equalTo: linkImage.leadingAnchor, constant: 30).isActive = true
    noteLabel.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -20).isActive = true

Я ценю любую помощь по этому вопросу:)

Ответы [ 3 ]

1 голос
/ 16 января 2020

Вы можете установить ограничения с помощью фрейма или с помощью автоматического размещения, оба не могут работать одновременно. когда вы устанавливаете v.translatesAutoresizingMaskIntoConstraints = false, то настройка фрейма не влияет, а также вы должны добавить ограничение по высоте

// constrain linkLabel
    linkLabel.topAnchor.constraint(equalTo: linkImage.topAnchor).isActive = true
    linkLabel.leadingAnchor.constraint(equalTo: linkImage.leadingAnchor, constant: 30).isActive = true
    linkLabel.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -20).isActive = true
    linkLabel.heightAnchor.constraint(equalToConstant: 20).isActive = true
1 голос
/ 16 января 2020

Решение:

Проблема была в UITextViews padding. Удаление всех прокладок решило проблему:

let padding = v.textContainer.lineFragmentPadding
 v.textContainerInset =  UIEdgeInsets(top: 0, left: -padding, bottom: 0, right: -padding)
1 голос
/ 16 января 2020

Когда вы устанавливаете

v.translatesAutoresizingMaskIntoConstraints = false

, тогда настройка кадра игнорируется, кстати вам нужна высота

linkLabel.heightAnchor.constraint(equalToConstant: 30).isActive = true
...