Как сделать простую округлую кнопку в Раскадровке?

Я только начал изучать разработку под iOS, не могу найти, как сделать простую круглую кнопку. Нахожу ресурсы по старым версиям. Мне нужно установить собственный фон для кнопки? В Android я бы просто использовал патч 9, но я знаю, что iOS не имеет такой возможности.

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


person Gintas_    schedule 10.08.2016    source источник


Ответы (12)


Чтобы сделать это в раскадровке, вам нужно использовать изображение для кнопки.

В качестве альтернативы вы можете сделать это в коде:

 btn.layer.cornerRadius = 10
 btn.clipsToBounds = true
person realtimez    schedule 10.08.2016
comment
зачем нужен clipsToBounds? Кажется, эта тень не работает, пока я ее не уберу. - person Gintas_; 11.08.2016
comment
Хороший ответ, но вы можете сделать это в IB, без изображений. См. ниже. - person zontar; 02.11.2017

Краткий ответ: ДА

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

Он не будет отображаться в Storyboard, но он будет работать нормально, когда вы запустите проект.

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

Примечание.
"Путь к ключу" layer.cornerRadius и значение 5. Это значение необходимо изменить в соответствии с высотой и шириной кнопки. Формула для этого - высота кнопки * 0,50. Поэтому поиграйте со значением, чтобы увидеть ожидаемую округленную кнопку в симуляторе или на физическом устройстве. Эта процедура будет выглядеть утомительной, если у вас есть более одной кнопки для округления в раскадровке.

person Nishant    schedule 10.08.2016
comment
Пожалуйста, оставьте комментарий при отрицательном голосовании. - person Nishant; 10.08.2016
comment
досадно, что IB не может показать это как обычное приложение для рисования. - person Cerniuk; 06.03.2017
comment
@WilliamCerniuk: На самом деле может. Ознакомьтесь с nshipster.com/ibinspectable-ibdesignable - person Nishant; 06.03.2017
comment
Установка атрибутов времени выполнения, определяемых пользователем, действительно работает, их можно просмотреть в симуляторе после сборки. - person Cons Bulaquena; 24.01.2018
comment
Как говорится в принятом ответе, вам также может потребоваться добавить логический путь ключа clipsToBounds, чтобы это работало. - person Max; 01.06.2018
comment
Нет необходимости импортировать #import ‹QuartzCore / QuartzCore.h› - person Parth Patel; 27.12.2018

Вы можете сделать что-то вроде этого:

@IBDesignable class MyButton: UIButton
{
    override func layoutSubviews() {
        super.layoutSubviews()

        updateCornerRadius()
    }

    @IBInspectable var rounded: Bool = false {
        didSet {
            updateCornerRadius()
        }
    }

    func updateCornerRadius() {
        layer.cornerRadius = rounded ? frame.size.height / 2 : 0
    }
}

Установите class в MyButton в Identity Inspector, и в IB у вас будет свойство rounded:

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

person ChikabuZ    schedule 10.08.2016
comment
Безусловно, лучший ответ. Узнал что-то классное сегодня новое! - person Mark; 04.02.2017
comment
Это неполный ответ. Когда вы запускаете приложение, xCode будет использовать размер кадра представления в построителе интерфейса, а не реальный размер кадра во время работы приложения. - person Simon Backx; 14.04.2017
comment
Вы также можете использовать didSet вместо willSet и удалить аргумент isRounded. - person Simon Backx; 15.04.2017
comment
Если вы используете фоновое изображение, также установите layer.masksToBounds = true - person zontar; 02.11.2017

  1. Создайте класс Cocoa Touch.

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

  1. Вставьте код в класс RoundButton.

    import UIKit
    
    @IBDesignable
    class RoundButton: UIButton {
    
        @IBInspectable var cornerRadius: CGFloat = 0{
            didSet{
            self.layer.cornerRadius = cornerRadius
            }
        }
    
        @IBInspectable var borderWidth: CGFloat = 0{
            didSet{
                self.layer.borderWidth = borderWidth
            }
        }
    
        @IBInspectable var borderColor: UIColor = UIColor.clear{
            didSet{
                self.layer.borderColor = borderColor.cgColor
            }
        }
    }
    
  2. Обратитесь к изображению.

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

person anson    schedule 22.08.2017
comment
Не знаю, сталкивались ли с этим и другие, но как только я установил класс для кнопки и дал ему радиус, ширину границы и цвет границы, Xcode (9.2) выдает ошибку, что произошла ошибка рендеринга. Сборка приложения удалась, но красный цвет! продолжает отображаться. Просто говорю ... Я вернулся к решению только с кодом (хотя это был действительно элегантный способ). - person Aeger; 17.01.2018

Я нашел самый простой способ сделать это - установить угол радиуса равным половине высоты представления.

button.layer.cornerRadius = button.bounds.size.height/2
person FrankkieNL    schedule 27.02.2018
comment
Нет, я не. Если у вас одинаковая высота и ширина (значит, он был бы квадратным), то вы получите круг. Но если ширина больше высоты, кнопка будет правильной. - person FrankkieNL; 20.03.2018
comment
Вы правы, я пропустил изображение, включенное в вопрос, которое показывает, чем был плакат на самом деле после того, как ваш ответ больше соответствовал принятому ответу - upvote - person Michael Hudson; 20.03.2018

Поскольку другой ответ предлагал выполнить большую часть этой работы в коде, только один ответ фактически предоставил способ просмотра ваших изменений в интерфейсе раскадровки IB. Мой ответ выходит за рамки этого ответа, позволяя вам изменять угол радиуса представления, кнопки, изображения и т. Д.

Взгляните на следующий код. Чтобы использовать этот код, создайте новый быстрый файл с именем RoundedView или как вы хотите его назвать, затем перейдите в свою раскадровку и измените класс на «RoundedView», «RoundedImageView» или «RoundedButton».

import UIKit

@IBDesignable class RoundedImage: UIImageView
{
    override func layoutSubviews() {
        super.layoutSubviews()

        updateCornerRadius()
    }

    @IBInspectable var rounded: Bool = false {
        didSet {
            updateCornerRadius()
        }
    }

    @IBInspectable var cornerRadius: CGFloat = 0.1 {
        didSet {
            updateCornerRadius()
        }
    }

    func updateCornerRadius() {
        layer.cornerRadius = rounded ? cornerRadius : 0
        layer.masksToBounds = rounded ? true : false
    }
}

@IBDesignable class RoundedView: UIView
{
    override func layoutSubviews() {
        super.layoutSubviews()

        updateCornerRadius()
    }

    @IBInspectable var rounded: Bool = false {
        didSet {
            updateCornerRadius()
        }
    }

    @IBInspectable var cornerRadius: CGFloat = 0.1 {
        didSet {
            updateCornerRadius()
        }
    }

    func updateCornerRadius() {
        layer.cornerRadius = rounded ? cornerRadius : 0
        layer.masksToBounds = rounded ? true : false
    }
}

@IBDesignable class RoundedButton: UIButton
{
    override func layoutSubviews() {
        super.layoutSubviews()

        updateCornerRadius()
    }

    @IBInspectable var rounded: Bool = false {
        didSet {
            updateCornerRadius()
        }
    }

    @IBInspectable var cornerRadius: CGFloat = 0.1 {
        didSet {
            updateCornerRadius()
        }
    }

    func updateCornerRadius() {
        layer.cornerRadius = rounded ? cornerRadius : 0
        layer.masksToBounds = rounded ? true : false
    }
}
person Joseph Shenton    schedule 28.09.2017

Вы можете подключить IBOutlet кнопки из раскадровки.

Затем вы можете настроить corner radius кнопки так, чтобы угол был закругленным.

например, ваш outlet равен myButton, тогда,

Obj - C

 self.myButton.layer.cornerRadius = 5.0 ;

Быстрый

  myButton.layer.cornerRadius = 5.0

Если вам нужна точная круглая кнопка, тогда width и height вашей кнопки должны быть equal и cornerRadius должны быть равны высоте или ширине / 2 (половине ширины или высоты).

person Ketan Parmar    schedule 10.08.2016

Следуйте приведенному ниже снимку экрана. Он работает, когда вы запускаете симулятор (не увидите его при предварительном просмотре)

Добавление закругленной границы UIView

person Xavier Chia    schedule 28.10.2020

При добавлении layer.cornerRadius в раскадровку убедитесь, что у вас нет начальных и конечных пробелов. Если вы сделаете копипаст, вы можете вставить пробелы. Было бы неплохо, если бы XCode сообщал какое-то предупреждение или ошибку.

person venki mohan    schedule 05.07.2017

Я использую Xcode версии 11.4

В инспекторе атрибутов вы можете определить радиус угла.

Он не будет отображаться в раскадровке, но он будет работать нормально при запуске проекта.

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

person casillas    schedule 29.04.2020

Расширение - лучший вариант решения этой проблемы. Создайте расширение View или Button

public extension UIView {
  //Round the corners
  func roundCorners(){
    let radius = bounds.maxX / 16
    layer.cornerRadius = radius
  }
}

Назовите это из кода

button.roundCorners()
person muhammad usman    schedule 19.02.2020

Попробуй это!!

 override func viewDidLoad() {
   super.viewDidLoad()

   var button = UIButton.buttonWithType(.Custom) as UIButton
   button.frame = CGRectMake(160, 100, 200,40)

   button.layer.cornerRadius =5.0
   button.layer.borderColor = UIColor.redColor().CGColor
   button.layer.borderWidth = 2.0

   button.setImage(UIImage(named:"Placeholder.png"), forState: .Normal)
   button.addTarget(self, action: "OnClickroundButton", forControlEvents: .TouchUpInside)
   button.clipsToBounds = true

   view.addSubview(button)
}
    func OnClickroundButton() {
   NSLog(@"roundButton Method Called");
}
person Sanjeet verma    schedule 10.08.2016