Я пытался создать протокол и делегировать между пользовательской кнопкой пользовательского интерфейса и контроллером родительско-дочернего представления. Вкратце, у меня есть родительский контроллер представления, дочерний контроллер представления и пользовательская кнопка пользовательского интерфейса. Кнопка пользовательского интерфейса и дочерний виртуальный виртуальный компьютер находятся в родительском виртуальном канале. Я создал делегат протокола для пользовательской кнопки пользовательского интерфейса.
Я хочу изменить начало кадра просмотра дочернего виртуального канала, нажав кнопку пользовательского интерфейса. Я также хочу изменить изображение пользовательской кнопки пользовательского интерфейса при нажатии кнопки. Однако, когда я пытаюсь изменить изображение пользовательской кнопки пользовательского интерфейса, а также вызвать метод делегата, дочернее представление VC сначала обновляет положение кадра представления дочернего VC, как в методе представления обновления. Но позже он сбрасывает положение кадра в исходное положение. Вот пример кода:
Родительский контроллер представления
class ParentViewController: UIViewController {
let childVC: ChildViewController = {
let childVC = ChildViewController()
childVC.view.translatesAutoresizingMaskIntoConstraints = false
return childVC
}()
let customButton: CustomUIButton = {
let button = CustomUIButton(frame: .zero)
button.translatesAutoresizingMaskIntoConstraints = false
return button
}()
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .white
setupCustomButton()
setupChildVC()
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
applyConstraints()
}
private func setupCustomButton() {
view.addSubview(customButton)
customButton.delegate = self
}
private func setupChildVC() {
addChild(childVC)
view.addSubview(childVC.view)
childVC.didMove(toParent: self)
}
private func applyConstraints() {
let childVCConstraints = [
childVC.view.leadingAnchor.constraint(equalTo: view.leadingAnchor),
childVC.view.trailingAnchor.constraint(equalTo: view.trailingAnchor),
childVC.view.heightAnchor.constraint(equalToConstant: 65),
childVC.view.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -200)
]
let customButtonConstraints = [
customButton.centerXAnchor.constraint(equalTo: view.centerXAnchor),
customButton.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -50),
customButton.heightAnchor.constraint(equalToConstant: 70),
customButton.widthAnchor.constraint(equalToConstant: 70)
]
NSLayoutConstraint.activate(childVCConstraints)
NSLayoutConstraint.activate(customButtonConstraints)
}
}
extension ParentViewController: CustomUIButtonDelegate {
func customUIButtonDidTap() {
self.childVC.updateView()
}
}
Контроллер дочернего представления
class ChildViewController: UIViewController {
var isHidden: Bool = false
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .systemBlue
}
func updateView() {
if isHidden {
UIView.animate(withDuration: 0.3) {
self.view.frame.origin.y -= 200
self.isHidden = false
}
} else {
UIView.animate(withDuration: 0.3) {
self.view.frame.origin.y += 200
self.isHidden = true
}
}
}
}
Пользовательская кнопка пользовательского интерфейса
protocol CustomUIButtonDelegate: AnyObject {
func customUIButtonDidTap()
}
class CustomUIButton: UIButton {
weak var delegate: CustomUIButtonDelegate?
var isDoing: Bool = false
let image1: UIImage = {
let image = UIImage(systemName: "chevron.right") ?? UIImage()
return image
}()
let image2: UIImage = {
let image = UIImage(systemName: "chevron.left") ?? UIImage()
return image
}()
override init(frame: CGRect) {
super.init(frame: frame)
setTitle("", for: .normal)
backgroundColor = .systemRed
layer.cornerRadius = 35
layer.shadowColor = UIColor.systemCyan.cgColor
layer.shadowOpacity = 0.8
layer.shadowOffset = CGSize(width: 0, height: 0)
addTarget(self, action: #selector(didButtonTapped), for: .touchUpInside)
}
@objc func didButtonTapped() {
self.isDoing = !isDoing
self.setImage(isDoing ? image1 : image2 , for: .normal)
delegate?.customUIButtonDidTap()
}
}
Если я не изменю изображение пользовательской кнопки пользовательского интерфейса в методе делегата, оно будет работать без сброса положения кадра в его первое положение. Я не уверен, почему установка изображения кнопки имеет такой эффект.
Цель пользовательской кнопки пользовательского интерфейса без обновления изображения пользовательской кнопки
@objc func didButtonTapped() {
// self.isDoing = !isDoing
// self.setImage(isDoing ? image1 : image2 , for: .normal)
delegate?.customUIButtonDidTap()
}
Подробнее здесь: https://stackoverflow.com/questions/785 ... ted-effect
Делегат протокола из пользовательской кнопки пользовательского интерфейса имеет нежелательный эффект ⇐ IOS
Программируем под IOS
1716216552
Anonymous
Я пытался создать протокол и делегировать между пользовательской кнопкой пользовательского интерфейса и контроллером родительско-дочернего представления. Вкратце, у меня есть родительский контроллер представления, дочерний контроллер представления и пользовательская кнопка пользовательского интерфейса. Кнопка пользовательского интерфейса и дочерний виртуальный виртуальный компьютер находятся в родительском виртуальном канале. Я создал делегат протокола для пользовательской кнопки пользовательского интерфейса.
Я хочу изменить начало кадра просмотра дочернего виртуального канала, нажав кнопку пользовательского интерфейса. Я также хочу изменить изображение пользовательской кнопки пользовательского интерфейса при нажатии кнопки. Однако, когда я пытаюсь изменить изображение пользовательской кнопки пользовательского интерфейса, а также вызвать метод делегата, дочернее представление VC сначала обновляет положение кадра представления дочернего VC, как в методе представления обновления. Но позже он сбрасывает положение кадра в исходное положение. Вот пример кода:
[b]Родительский контроллер представления[/b]
class ParentViewController: UIViewController {
let childVC: ChildViewController = {
let childVC = ChildViewController()
childVC.view.translatesAutoresizingMaskIntoConstraints = false
return childVC
}()
let customButton: CustomUIButton = {
let button = CustomUIButton(frame: .zero)
button.translatesAutoresizingMaskIntoConstraints = false
return button
}()
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .white
setupCustomButton()
setupChildVC()
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
applyConstraints()
}
private func setupCustomButton() {
view.addSubview(customButton)
customButton.delegate = self
}
private func setupChildVC() {
addChild(childVC)
view.addSubview(childVC.view)
childVC.didMove(toParent: self)
}
private func applyConstraints() {
let childVCConstraints = [
childVC.view.leadingAnchor.constraint(equalTo: view.leadingAnchor),
childVC.view.trailingAnchor.constraint(equalTo: view.trailingAnchor),
childVC.view.heightAnchor.constraint(equalToConstant: 65),
childVC.view.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -200)
]
let customButtonConstraints = [
customButton.centerXAnchor.constraint(equalTo: view.centerXAnchor),
customButton.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -50),
customButton.heightAnchor.constraint(equalToConstant: 70),
customButton.widthAnchor.constraint(equalToConstant: 70)
]
NSLayoutConstraint.activate(childVCConstraints)
NSLayoutConstraint.activate(customButtonConstraints)
}
}
extension ParentViewController: CustomUIButtonDelegate {
func customUIButtonDidTap() {
self.childVC.updateView()
}
}
[b]Контроллер дочернего представления[/b]
class ChildViewController: UIViewController {
var isHidden: Bool = false
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .systemBlue
}
func updateView() {
if isHidden {
UIView.animate(withDuration: 0.3) {
self.view.frame.origin.y -= 200
self.isHidden = false
}
} else {
UIView.animate(withDuration: 0.3) {
self.view.frame.origin.y += 200
self.isHidden = true
}
}
}
}
[b]Пользовательская кнопка пользовательского интерфейса[/b]
protocol CustomUIButtonDelegate: AnyObject {
func customUIButtonDidTap()
}
class CustomUIButton: UIButton {
weak var delegate: CustomUIButtonDelegate?
var isDoing: Bool = false
let image1: UIImage = {
let image = UIImage(systemName: "chevron.right") ?? UIImage()
return image
}()
let image2: UIImage = {
let image = UIImage(systemName: "chevron.left") ?? UIImage()
return image
}()
override init(frame: CGRect) {
super.init(frame: frame)
setTitle("", for: .normal)
backgroundColor = .systemRed
layer.cornerRadius = 35
layer.shadowColor = UIColor.systemCyan.cgColor
layer.shadowOpacity = 0.8
layer.shadowOffset = CGSize(width: 0, height: 0)
addTarget(self, action: #selector(didButtonTapped), for: .touchUpInside)
}
@objc func didButtonTapped() {
self.isDoing = !isDoing
self.setImage(isDoing ? image1 : image2 , for: .normal)
delegate?.customUIButtonDidTap()
}
}
Если я не изменю изображение пользовательской кнопки пользовательского интерфейса в методе делегата, оно будет работать без сброса положения кадра в его первое положение. Я не уверен, почему установка изображения кнопки имеет такой эффект.
[b]Цель пользовательской кнопки пользовательского интерфейса без обновления изображения пользовательской кнопки[/b]
@objc func didButtonTapped() {
// self.isDoing = !isDoing
// self.setImage(isDoing ? image1 : image2 , for: .normal)
delegate?.customUIButtonDidTap()
}
Подробнее здесь: [url]https://stackoverflow.com/questions/78502475/protocol-delegate-from-custom-ui-button-has-unwanted-effect[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия