метка, показывающая верхнюю часть экрана, а не на inputAccessoryView

Вот мой код:

 var messageView : UITextView = {
        var textView = UITextView()
        textView.text = "   Add your message here"
        textView.textColor = UIColor.lightGrayColor()
        textView.translatesAutoresizingMaskIntoConstraints = false
        textView.backgroundColor = UIColor.lightGrayColor()
        textView.layer.cornerRadius = 3
        textView.clipsToBounds = true
        textView.keyboardAppearance = .Dark
        textView.layer.borderWidth = 1.0
        textView.layer.borderColor = UIColor.lightGrayColor()
        textView.autocorrectionType = .no


        // MARK: Setup accesorryView

        let label = UILabel()
        label.text = "You have a 100 character limit"
        label.translatesAutoresizingMaskIntoConstraints = false

        let accessoryView = UIView(frame: CGRectMake(0, 0, UIScreen.mainScreen().bounds.width, 44))
        accessoryView.backgroundColor = UIColor.redColor()

        accessoryView.addSubview(label)

        accessoryView.leadingAnchor.constraintEqualToAnchor(label.leadingAnchor, constant: 18)
        accessoryView.centerYAnchor.constraintEqualToAnchor(label.centerYAnchor)

        textView.inputAccessoryView = accessoryView

        return textView
    }()

Я пытаюсь добавить inputAccessoryView на клавиатуру TextView. Мой inputAccessoryView должен иметь метку с надписью «У вас есть ограничение в 100 символов»...

Но мой текущий результат таков:

введите здесь описание изображения

Текст в синем... это именно та метка, которую я хочу видеть в inputAccessoryView, но она находится в верхней части моего экрана...


person Honey    schedule 16.05.2017    source источник
comment
вам нужен только текст, т.е. у вас есть ограничение в 100 символов для отображения в inputAccessoryView   -  person Maddy    schedule 16.05.2017
comment
@Maddy Мне также нужно добавить еще одну метку в правую часть inputAccessoryView, чтобы она действовала как счетчик, то есть показывала количество символов, которые осталось ввести...   -  person Honey    schedule 16.05.2017
comment
Вам явно не хватает рамки для этикетки   -  person Shubham Naik    schedule 17.05.2017
comment
Рамка не нужна с AutoLayout. Вы также пропустили активацию своих ограничений. Смотрите мой обновленный ответ.   -  person Mihai Fratu    schedule 17.05.2017
comment
@ Дорогая, проверь мой ответ в соответствии с твоими требованиями. Две метки добавлены одна слева, а другая справа с помощью автомакета.   -  person Maddy    schedule 17.05.2017


Ответы (2)


Вам нужно установить translatesAutoresizingMaskIntoConstraints на метке на false и isActive на true на ограничениях. В основном ваш код ограничений должен выглядеть так:

accessoryView.leadingAnchor.constraintEqualToAnchor(label.leadingAnchor, constant: 18).isActive = true
accessoryView.centerYAnchor.constraintEqualToAnchor(label.centerYAnchor).isActive = true
person Mihai Fratu    schedule 16.05.2017
comment
результат тот же...без улучшений. Что-нибудь еще вы можете придумать? Я обновлю свой вопрос, чтобы отразить ваш ответ, хотя... - person Honey; 16.05.2017
comment
Я сделал правку... нужно ли мне делать это и для самого аксессуара или в этом нет необходимости? (Я тоже пробовал это, но просто хочу знать, нужно ли это и для этого? - person Honey; 16.05.2017
comment
Почему мне нужно установить isActive в true? Мне почти никогда не приходилось устанавливать его раньше где-либо ... - person Honey; 17.05.2017
comment
@Honey isActive используется для активации или деактивации ограничения. Если вы не хотите использовать это, вы также можете добиться того же результата. NSLayoutConstraint.activate([accessoryView.leadingAnchor.constraint(equalTo: label.leadingAnchor, constant: 0),accessoryView.centerYAnchor.constraint(equalTo: label.centerYAnchor)]). Он активирует каждое ограничение в указанном массиве, и нет необходимости делать это каждый раз. - person Maddy; 17.05.2017
comment
@ Мэдди, я знаю, в чем была моя ошибка. См. здесь - person Honey; 19.05.2017

Насколько я понимаю, попробуйте следующее:

Свифт 3

let accessoryView = UIView()
let label         = UILabel()
let counterLabel  = UILabel()//This is the counter label

label.text        = "You have a 100 character limit"
counterLabel.text = "100"

accessoryView.frame = CGRect.init(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: 44)

accessoryView.backgroundColor = UIColor.red

accessoryView.addSubview(label)
accessoryView.addSubview(counterLabel)

// to setup contraint set below property to false.
label.translatesAutoresizingMaskIntoConstraints = false
counterLabel.translatesAutoresizingMaskIntoConstraints = false

//label constrint with 0 padding from left side. To change padding from left and right side, change the constant value.
accessoryView.leadingAnchor.constraint(equalTo: label.leadingAnchor, constant: 0).isActive = true

accessoryView.centerYAnchor.constraint(equalTo: label.centerYAnchor).isActive = true

//counterl=Label constrint with 0 padding from right side
        accessoryView.trailingAnchor.constraint(equalTo:counterLabel.trailingAnchor, constant: 0).isActive = true

accessoryView.centerYAnchor.constraint(equalTo: counterLabel.centerYAnchor).isActive = true

textView.inputAccessoryView = accessoryView
person Maddy    schedule 16.05.2017
comment
Хотя это не так, это не использует AutoLayout, как того хотел OP. Смотрите мой обновленный ответ. - person Mihai Fratu; 17.05.2017
comment
@MihaiFratu, это полный ответ, который хочет ОП - person Maddy; 17.05.2017
comment
Верно :) Но это не то, что я прокомментировал;) stackoverflow.com/revisions/44009957/1 - person Mihai Fratu; 17.05.2017
comment
Да, ваш обряд, я обновил это после проверки OP ?noredirect=1#comment75048376_44008908">комментарий :) - person Maddy; 17.05.2017
comment
Ваш ответ более полный, но только в том, что принятый ответ содержит 2 важных подсказки (установка isActive и translatesAutoresizingMaskIntoConstraints перед вашим: / Я только проголосовал ... Спасибо - person Honey; 17.05.2017
comment
согласился @Honey, принятый ответ был не подробным, а по существу :) - person Maddy; 17.05.2017