Как правильно рассчитать угловой радиус в зависимости от рамки кнопки

#ios #swift #uibutton #swift3

#iOS #swift #uibutton #swift3

Вопрос:

Как рассчитать cornerRadius свойство на основе рамки кнопки для создания закругленных углов.

Мне не нравится переопределять каждый временной угол cornerRadius для каждого элемента кнопки.

Я создаю расширение для UIButton .

 extension UIButton {

    func setRoundedCorners(){
        self.layer.cornerRadius = 10
        self.layer.borderWidth = 1
    }

}
  

И я хотел бы знать, как тоже динамически вычислять cornerRadius каждый раз, когда я использую эту функцию.

Основная проблема — найти функцию, которая будет вычислять .cornerRadius для разных размеров кнопок. Приведенный ниже пример покажет небольшую разницу.

Пример:

Радиус угла равен 10:

:введите описание изображения здесь

Радиус угла равен 15:

введите описание изображения здесь

Можно ли найти функцию, которая вычислит правильное значение, которое даст радиус угла?

Комментарии:

1. Какую кнопку вам нужно, дайте мне пользовательский интерфейс, я дам вам код..

2. Основная идея — получить гибкую функцию, которая будет вычислять правильный радиус угла для разных кнопок на основе их рамки

3. Но какую форму вы хотите, например, круглую или просто закругленные углы?

4. Да, просто закругленные углы

5. self. layer.cornerRadius = self.frame.size.height / 0.5; Задайте произвольное число для деления, и вы получите угловые радиоприемники в соотношении.

Ответ №1:

Это расширение может вам помочь — оно вычисляет и устанавливает радиус угла для данного UIView экземпляра на основе его frame свойства:

 extension UIView {
    /**
     Magically computes and sets an ideal corner radius.
     */
    public func magicallySetCornerRadius() {
        layer.cornerRadius = 0.188 * min(frame.width, frame.height)
        layer.masksToBounds = true
    }
}
  

Вот как я использовал его в файле «ViewController.swift» для трех файлов разного размера UIButtons :

 import UIKit

class ViewController: UIViewController {

    private func addButton(frame: CGRect, backgroundColor: UIColor) {
        let button = UIButton(frame: frame)
        button.backgroundColor = backgroundColor
        button.magicallySetCornerRadius()
        button.layer.borderColor = UIColor.black.cgColor
        button.layer.borderWidth = 1.0
        view.addSubview(button)
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        addButton(frame: CGRect(x: 40.0, y: 100.0, width: 100.0, height: 300.0), backgroundColor: .blue)
        addButton(frame: CGRect(x: 160.0, y: 180.0, width: 100.0, height: 100.0), backgroundColor: .green)
        addButton(frame: CGRect(x: 160.0, y: 300.0, width: 180.0, height: 100.0), backgroundColor: .red)
        addButton(frame: CGRect(x: 40.0, y: 420.0, width: 300.0, height: 150.0), backgroundColor: .yellow)
    }

}
  

… и вот как выглядит результат:

введите описание изображения здесь

Ответ №2:

Попробуйте этот код:

btn1 , btn2 и btnarrival являются UIButton экземплярами:

  btn1.setCornerRadius()
 btn2.setCornerRadius()
 btnarrival.setCornerRadius()


extension UIButton {
    func setCornerRadius() {
        layer.cornerRadius = frame.size.height / 2.0
        clipsToBounds = true
    }
}
  

Вы хотите, чтобы кнопка выглядела так, тогда попробуйте этот мой код..

Комментарии:

1. в чем проблема в моем этом коде. кто проголосовал против, пожалуйста, уточните это.

2. В моем коде, если вы хотите дать меньше углового радиуса, просто разделите 3, чтобы ваш угловой радиус уменьшился.. Если вы согласны со мной, тогда проголосуйте.

3. Качество кода ужасное. Имена противоречат всем правилам стиля. Метод (instance) фактически не затрагивает экземпляр, а передает аргумент. Тип аргумента неявно разворачивается без причины. И так далее…

4. Кроме того, я не думаю, что подталкивать людей к голосованию — это правильный способ получить репутацию на SO.

5. Хорошо, спасибо за ваш совет @NikolaiRuhe если вы не возражаете, пожалуйста, напишите ту же функцию в своем стиле, чтобы я получил новый стиль для написания хорошей функции.

Ответ №3:

Основная идея — получить гибкую функцию, которая будет вычислять правильный радиус угла для разных кнопок на основе их рамки

Я думаю, вам решать, что вы передаете в качестве аргументов:

 extension UIButton {
    func setRoundedCorners(ratio: Double?) {
        if let r = ratio {
            self.layer.cornerRadius = self.frame.size.width*r // for specific corner ratio                            
        } else {

            // circle
            // i would put a condition, as width and height differ:
            if(self.frame.size.width == self.frame.size.height) {
                self.layer.cornerRadius = self.frame.size.width/2 // for circles
            } else {
                //
            }
        }
        self.layer.borderWidth = 1
    }
}
  

Использование

 let button = UIButton()
button.setRoundedCorners(ratio: 0.25) // shape with rounded corners
button.setRoundedCorners() // circle
  

Комментарии:

1. Можно ли написать функцию, которая будет вычислять это соотношение на основе кадра кнопки

2. Проблема в том, что с помощью функции неправильно вычисляется радиус угла.

3. Если кто-то автоматически проголосует против ответов людей, кто-нибудь захочет ответить на этот вопрос?

4. Но я не подаю никаких голосов по этому вопросу, это плохая практика

5. я согласен с вами @pedrouan

Ответ №4:

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

 extension UIView{
    func cornerCalculation(r: CGFloat) {
        self.layer.cornerRadius = self.frame.height/2 * r
    }
}
  

а затем просто вызовите:

 button.cornerCalculation(r: 1)
  

r будет любым числом между 0 (острые края) и 1 (полностью закругленные края)