У меня есть кнопка. Моя кнопка работает нормально. Я хочу добавить представление стека внутри кнопки. И если кнопка нажата, я хочу видеть анимацию нажатия кнопки по умолчанию в моем представлении стека. Но когда я добавляю представление стека внутри кнопки, моя кнопка не нажимается, и действие не вызывается.
это код, который я использую:
var imageView: UIImageView = {
let image = UIImageView()
image.contentMode = .scaleAspectFill
return image
}()
var button: UIButton = {
let button = UIButton()
button.translatesAutoresizingMaskIntoConstraints = false
button.setTitle("gfhjk", for: .normal)
return button
}()
var textView: UIView = {
let view = UIView()
view.backgroundColor = .blue
view.layer.borderColor = UIColor.red.cgColor
view.layer.borderWidth = 3
view.layer.cornerRadius = 24
view.layer.maskedCorners = [.layerMinXMaxYCorner, .layerMaxXMaxYCorner]
return view
}()
var title: UILabel = {
let label = UILabel()
label.textColor = .white
label.textAlignment = .center
label.font = UIFont(name: "Marker Felt", size: 24)
label.numberOfLines = 0
label.translatesAutoresizingMaskIntoConstraints = false
return label
}()
var firstSpaceView: UIView = {
let view = UIImageView()
return view
}()
var secondSpaceView: UIView = {
let view = UIImageView()
return view
}()
var stackView: UIStackView = {
let stack = UIStackView()
stack.axis = .vertical
stack.distribution = .fillProportionally
stack.translatesAutoresizingMaskIntoConstraints = false
stack.layer.shadowColor = UIColor.black.cgColor
stack.layer.shadowOffset = CGSize.zero
stack.layer.shadowOpacity = 0.6
stack.layer.shadowRadius = 3
return stack
}()
override init(frame: CGRect) {
super.init(frame: frame)
setupView()
setupConstraints()
button.addTarget(self, action: #selector(self.buttonAction), for: .touchDown)
}
func setupView() {
stackView.addArrangedSubview(firstSpaceView)
stackView.addArrangedSubview(imageView)
stackView.addArrangedSubview(textView)
stackView.addArrangedSubview(secondSpaceView)
contentView.addSubview(button)
button.addSubview(stackView)
textView.addSubview(title)
stackView.sendSubview(toBack: textView)
textView.bringSubview(toFront: title)
}
@objc func buttonAction(sender: SLButton!) {
print("text")
}
Я добавил изображения, чтобы показать, чего я хочу:
@Sweeper Добавлен рассматриваемый SLButton. Анимация SLButton. Когда я нажимаю кнопку, действие не работает. Но когда я удаляю действие просмотра стека, оно работает нормально, и анимация тоже работает.
@user - просмотрите Как задать вопрос и минимальный воспроизводимый пример.
@user — как правило, добавлять подпредставления в UIButton — плохая идея. Вероятно, вам следует сделать это подклассом UIView и обрабатывать касания.





Причина, по которой ваша кнопка не работает, заключается в том, что представление стека теперь находится над вашей кнопкой. Когда вы касаетесь кнопки, она фактически касается представления стека, и для нее не требуется жест касания. Вам следует отключить взаимодействие этого вида стека stackView.isUserInteractionEnabled = false
Но, как упомянул @Dogmag, это не очень хороший подход. Вам следует создать собственный класс, расширить его из UIControl и обработать его состояние выделения.
class CustomButton: UIControl {
// MARK: - Properties
public let stackView = UIStackView()
override open var isHighlighted: Bool {
didSet {
reloadStyles()
}
}
// MARK: - Constructors
public init() {
super.init(frame: .zero)
self.commonInit()
}
required public init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
// MARK: - Private methods
private func commonInit() {
setupViews()
}
private func setupViews() {
setupInteraction()
self.addSubview(stackView)
}
/// Disable all subviews interaction to make this button's interaction works
private func setupInteraction() {
isUserInteractionEnabled = true
stackView.isUserInteractionEnabled = false
}
private func reloadStyles() {
if isHighlighted {
// Handle highlight state here
} else {
// Handle normal state here
}
}
}
Что такое
SLButton? Какую анимацию вы ожидаете?