Как замаскировать UIButton в Swift? - PullRequest
1 голос
/ 13 июля 2020

У меня сложное представление стека с множеством упорядоченных ярлыков и кнопок. Когда я попытался замаскировать все представление стека, чтобы обеспечить угловой радиус, кнопки в представлении стека больше не работали ( селекторы действий не срабатывают при касании внутри ). Я решил сначала упростить задачу до одной кнопки и одной маски следующим образом:

    let mask = UIView()
    mask.translatesAutoresizingMaskIntoConstraints  = false
    mask.backgroundColor = .green
    mask.layer.cornerRadius = 50
    view.addSubview(mask)
    mask.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
    mask.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
    mask.widthAnchor.constraint(equalToConstant: 200).isActive = true
    mask.heightAnchor.constraint(equalToConstant: 100).isActive = true
    
    
    
    btn = UIButton()
    btn.backgroundColor = .red
    btn.translatesAutoresizingMaskIntoConstraints  = false
    btn.setTitle("More info", for: .normal)
    btn.tintColor = .black
    btn.addTarget(self, action: #selector(moreInfoTapped), for: .touchUpInside)
    
    
    view.addSubview(btn)
    btn.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
    btn.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
    btn.widthAnchor.constraint(equalToConstant: 200).isActive = true
    btn.heightAnchor.constraint(equalToConstant: 100).isActive = true
    
    
    view.layoutSubviews()
    view.setNeedsLayout()
    
    btn.mask = mask

Это правильно маскирует кнопку, но, к сожалению, маска помещается перед кнопкой, и поэтому нажатие на кнопку никогда не регистрировался.

Это иерархия представлений:

Кнопка наложения маски

Я что-то упускаю?

Ответы [ 2 ]

1 голос
/ 14 июля 2020

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

Вы создадите mask, как хотите, с радиусом угла . Затем вы добавите button к маске, но с прозрачным фоном, и заставите его заполнить родительский объект, т.е. mask

let maskView = UIView()
view.addSubview(maskView)
maskView.setCornerRadius() // implement this
maskView.setupConstraints() // implement this

let button = UIButton()
button.backgroundColor = .clear
maskView.addSubview(button)
button.fillParent() // implement this

Тот же logi c будет применяться для просмотра стека. Вам просто нужно стилизовать представление контейнера или представление маски.

В качестве альтернативы вы можете включить как представление кнопки, так и представление маски в представление контейнера:

  • маска под кнопкой
  • кнопка должна быть очищена
  • вид контейнера должен быть ясным
  • стиль маски вида
  • маска и кнопка должны заполнять вид контейнера (или изменять их размер как лучше всего подойдет вам
1 голос
/ 13 июля 2020

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

mask.isUserInteractionEnabled = false
...