Как динамически установить угловой радиус UIButton? - PullRequest
1 голос
/ 23 мая 2019

У меня есть UIButton в раскадровке, которая автоматически изменяет размеры в зависимости от текущей ориентации устройства. У меня есть ограничение 1:1 на кнопку, а радиус угла кнопки всегда должен быть вдвое меньше, чтобы он отображался в виде круга.

Я попытался обновить радиус угла в viewDidLayoutSubviews следующим образом:

override func viewDidLayoutSubviews() {
    bigButton.layer.cornerRadius = 0.5 * bigButton.bounds.size.width
}

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

Есть ли простой способ получить ширину кнопки после изменения ее размера? Или есть другой подход для достижения желаемого эффекта? Спасибо за помощь!

Ответы [ 2 ]

0 голосов
/ 23 мая 2019

Вы можете сделать подкласс UIButton и установить layer.cornerRadius в layoutSubviews.

class RoundButton: UIButton {
    override func layoutSubviews() {
        super.layoutSubviews()

        layer.cornerRadius = bounds.height / 2
    }
}

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

import UIKit
import PlaygroundSupport

class MyViewController: UIViewController {
    private var button: RoundButton!

    override func loadView() {
        let view = UIView()
        view.backgroundColor = .white

        button = RoundButton()
        button.contentEdgeInsets = UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 20)
        button.translatesAutoresizingMaskIntoConstraints = false
        button.addTarget(self, action: #selector(tapButton), for: .touchUpInside)
        button.setTitle("Round", for: .normal)
        button.backgroundColor = .red
        view.addSubview(button)

        NSLayoutConstraint.activate([
            button.centerXAnchor.constraint(equalTo: view.centerXAnchor),
            button.centerYAnchor.constraint(equalTo: view.centerYAnchor)
        ])

        self.view = view
    }

    @objc private func tapButton(_ sender: Any) {
        button.contentEdgeInsets.top += 5
        button.contentEdgeInsets.bottom += 5
    }
}

class RoundButton: UIButton {
    override func layoutSubviews() {
        super.layoutSubviews()

        layer.cornerRadius = bounds.height / 2
    }
}

PlaygroundPage.current.liveView = MyViewController()
0 голосов
/ 23 мая 2019

Мне удалось добиться желаемого эффекта, установив радиус угла асинхронно:

override func viewDidLayoutSubviews() {
    DispatchQueue.main.asyncAfter(deadline: .now()) {
        self.bigButton.layer.cornerRadius = 0.5 * self.bigButton.bounds.size.width
    }
}

Анимация вращения становится немного неуклюжей, но этого должно быть достаточно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...