Установка ограничения ширины вида из пользовательского класса UIView без обновления фреймов - PullRequest
0 голосов
/ 14 апреля 2019

У меня есть UIView, в котором я хочу иметь простое представление загрузчика с использованием процента для определения ширины.

Я получил процентный код и знаю, что он работает.

Однако у меня проблемы с установкой ограничения ширины вида. Я нахожу ширину, получая ширину кадра и умножая ее на процент. Я знаю, что он получает правильную ширину. Но я не могу установить ограничение этой функции.

Мой код выглядит так в моем подклассе UIView:

func initSubviews() {
    // in here i do some other stuff and have an asyncronous call to an api
    // so then I've got this code calling the next function
    DispatchQueue.main.async {
        self.setCompletionWidth(nextTimer: nextTimer!, oldDate: oldDate!)
    }
}

func setCompletionWidth(nextTimer: Date, oldDate: Date) {
   let date = Date()

   // calculatePercent returns something like 0.49
   let percent = calculatePercent(middleDate: date, endDate: nextTimer, originalDate: oldDate)

   //this is returning a correct value
   let width = (self.frame.width)*percent

// completionView is the view I'm trying to change the width of
   self.completionView.widthAnchor.constraint(equalToConstant: width)
   self.layoutSubviews()
}

То, что происходит, - то, что завершениеПросмотр не получает правильную ширину. Я также пробовал в функции setCompletionWidth

self.completionView.widthAnchor.constraint(equalToConstant: width)
containerView.layoutSubviews()

и

UIView.animate(withDuration: 0.2) {
    self.completionView.widthAnchor.constraint(equalToConstant: width)
    self.containerView.layoutSubviews()
    //also tried self.layoutSubviews here
}

и

self.layoutIfNeeded()
self.completionView.widthAnchor.constraint(equalToConstant: width)
self.layoutIfNeeded()

Я ожидаю, что ширина окна завершения будет примерно равна 150, но вместо этого она равна 350, что соответствует исходной ширине.

Я думаю, что происходит, вид не обновляется после того, как я установил ограничение на другое значение. Тем не менее, я не могу на всю жизнь заставить его обновить. Я хотел бы помочь здесь.

1 Ответ

2 голосов
/ 14 апреля 2019

Вам нужно .isActive = true

self.completionView.widthAnchor.constraint(equalToConstant: width).isActive = true

Также для изменения ширины необходимо создать переменную ширины, например

var widthCon:NSLayoutConstraint!

widthCon =  self.completionView.widthAnchor.constraint(equalToConstant: width)
widthCon.isActive = true

Затем измените константу с помощью

widthCon.constant = /// some value 
self.superview!.layoutIfNeeded()
...