Как да направите прост заоблен бутон в Storyboard?

Току-що започнах да уча разработката на 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, но ще работи добре, когато стартирате проекта.

въведете описание на изображението тук

Забележка:
Стойността на 'Key Path' 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
    }
}

Задайте клас на 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
Прав си, пропуснах изображението, включено във въпроса, което показва какво всъщност е плакатът, след като съвпада повече с твоя отговор, отколкото с приетия отговор - гласуване за - person Michael Hudson; 20.03.2018

Тъй като други отговори предложиха да се извърши по-голямата част от тази работа в код, само един отговор всъщност предостави начин да видите вашите промени в интерфейса на Storyboard IB. Моят отговор надхвърля този отговор, като ви позволява да промените радиуса на ъгъла на изгледа, бутона, изображението и т.н.

Моля, разгледайте следния код. За да използвате този код, създайте нов swift файл, наречен 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

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

Няма да се покаже в Storyboard, но ще работи добре, когато стартирате проекта.

въведете описание на изображението тук

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