#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.
Дайте мне знать, если у вас все еще возникают какие-либо проблемы.