Почему кнопка появляется только со второй попытки?

#ios #swift #uiview #uibutton #addsubview

#iOS #swift #uiview #uibutton #addsubview

Вопрос:

Я пытаюсь добавить функцию, которая будет отображать кнопку закрытия в моем пользовательском представлении оповещений. Когда я вызываю ее в первый раз, появляется только пустая область, которая не содержит кнопки (без цвета, без текста и без нажатия). При повторном вызове — все работает так, как должно.

Это не зависит от параметра animated , в обоих случаях это работает одинаково.

My dialogView — это мой пользовательский UIView . Я не использую UIAlertController

В чем может быть проблема?

первоначальный вид после первой попытки вторая попытка
GIF вызывает функцию щелчком мыши

 func showCloseButton(text: String, animated: Bool){
        let dialogViewHeight = self.dialogView.frame.height   50   1

        let button = UIButton(type: .roundedRect)
        button.backgroundColor = .red
        button.frame.origin = CGPoint(x: 0, y: dialogViewHeight)
        button.frame.size = CGSize(width: self.dialogView.frame.width, height: 50)
        button.setTitle(text, for: .normal)
        button.addTarget(self, action: #selector(closeTapped), for: .touchUpInside)

        let separatorLineView = UIView()
        separatorLineView.frame.origin = CGPoint(x: 0, y: self.dialogView.frame.height)
        separatorLineView.frame.size = CGSize(width: dialogView.frame.width, height: 1)
        separatorLineView.backgroundColor = UIColor.groupTableViewBackground
        dialogView.addSubview(separatorLineView)

        if animated {
            animateAdjustDialogView(height: dialogViewHeight){
                Logger.Log("completion did")
                self.dialogView.addSubview(button)
            }
        } else {

            Logger.Log("button.frame.origin = (button.frame.origin)")
            Logger.Log("button.frame.size = (button.frame.size)")
            Logger.Log("button.title = (button.titleLabel)")

            self.dialogView.frame.size = CGSize(width: self.dialogView.frame.width, height: dialogViewHeight)
            self.dialogView.addSubview(button)
        }
    }

private func animateAdjustDialogView(height: CGFloat, completion: (()->Void)?){
        UIView.animate(withDuration: 1.0, animations: {
            self.dialogView.frame.size = CGSize(width: self.dialogView.frame.width, height: height)
            self.layoutIfNeeded()
        }) { (finished) in
            Logger.Log("finished = (finished)")
            if finished {
                Logger.Log("completion run")
                completion?()
            }
        }
    }
  

Комментарии:

1. @RobertDresler Извините, возможно, я написал это неправильно. Я добавил в описание — я не использую UIAlertController

2. Вы добавили self.dialogView.addSubview(button) для обоих случаев if и else также. Так что лучше добавьте кнопку до или после if-else .

3. @AmirKhan Но в первом случае if она используется не по умолчанию, а только в блоке завершения.

4. Ок, понял вашу точку зрения. Лучше добавьте эту кнопку и show/hide ее в соответствии со сценарием. ИЛИ добавить кнопку внутри основного потока — DispatchQueue.main.async { self.dialogView.addSubview(button) }

5. @AmirKhan Теперь я попытался добавить этот код и выполнить его как до, так и после if-else блока, результат тот же.

Ответ №1:

Проблема возникает из-за рамки кнопки —

 button.frame.origin = CGPoint(x: 0, y: dialogViewHeight)
  

Где

 let dialogViewHeight = self.dialogView.frame.height   50   1 
  

Это означает, что button выходит за dialogView frame рамки.

Итак, замените

 button.frame.origin = CGPoint(x: 0, y: dialogViewHeight)
  

С

 button.frame.origin = CGPoint(x: 0, y: dialogViewHeight - 50) // Height of the Button.
  

Дайте мне знать, если у вас все еще возникают какие-либо проблемы.