Storyboard'da basit bir yuvarlak düğme nasıl yapılır?


104

IOS geliştirmeyi öğrenmeye yeni başladım, basit yuvarlak düğmeyi nasıl yapacağımı bulamıyorum. Eski sürümler için kaynaklar buluyorum. Bir düğme için özel bir arka plan ayarlamam gerekir mi? Android'de sadece bir 9 yaması kullanırdım, ancak iOS'un bu özelliğe sahip olmadığını biliyorum.

görüntü açıklamasını buraya girin

Yanıtlar:


82

Film şeridinde yapmak için, düğme için bir resim kullanmanız gerekir.

Alternatif olarak kodla da yapabilirsiniz:

 btn.layer.cornerRadius = 10
 btn.clipsToBounds = true

2
ClipsToBounds neden gerekli? Görünüşe göre, o gölge ben kaldırana kadar çalışmıyor.
Gintas_

1
Güzel cevap, ancak IB'de görüntü olmadan yapabilirsiniz. Aşağıya bakınız.
zontar

224

Kısa Cevap: EVET

Ek bir arka plan görüntüsüne ihtiyaç duymadan veya bunun için herhangi bir kod yazmadan kesinlikle basit bir yuvarlak düğme yapabilirsiniz. İstenilen sonucu elde etmek için düğmenin çalışma zamanı niteliklerini ayarlamak için aşağıda verilen ekran görüntüsünü takip etmeniz yeterlidir.

İçinde gösterilmeyecek, Storyboardancak projeyi çalıştırdığınızda iyi çalışacaktır.

görüntü açıklamasını buraya girin

Not: 'anahtar yolu' ve değer değer düğmesi yüksekliği ve genişliğine göre değiştirilmesi gereken 5'tir. Bunun formülü, * 0.50 düğmesinin yüksekliğidir. Simülatörde veya fiziksel cihazda beklenen yuvarlak düğmeyi görmek için değer etrafında oynayın. Film şeridinde yuvarlanacak birden fazla düğmeniz olduğunda bu prosedür sıkıcı görünecektir.
layer.cornerRadius


9
Olumsuz oy verirken lütfen bir yorum ekleyin.
Nishant

7
IB'nin bunu hadde çekme uygulaması çalıştırması gibi gösterememesi hayal kırıklığı yaratıyor.
William Cerniuk

2
@WilliamCerniuk: Aslında olabilir. Nshipster.com/ibinspectable-ibdesignable sayfasına
Nishant

Kullanıcı Tanımlı Çalışma Zamanı özniteliklerinin ayarlanması gerçekten işe yarıyor ve oluşturulduktan sonra simülatörde görüntülenebilir.
Eksileri Bulaquena

Kabul edilen cevabın dediği gibi, clipsToBoundsbunun çalışması için bir Boolean anahtar yolu eklemeniz gerekebilir .
Maksimum

87

Bunun gibi bir şey yapabilirsiniz:

@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
    }
}

Sınıfı MyButtoniçinde olarak ayarlayın Identity Inspectorve IB'de roundedmülkünüz olacak :

görüntü açıklamasını buraya girin


4
Şimdiye kadar en iyi cevap. Bugün müthiş yeni bir şey öğrendim!
Mark

2
Bu cevap tam değil. Uygulamanızı başlattığınızda xCode, uygulama çalışırken gerçek çerçeve boyutunu değil, arayüz oluşturucudaki görünümün çerçeve boyutunu kullanır.
Simon Backx

2
Ayrıca "willSet" yerine "didSet" kullanabilir ve isRounded bağımsız değişkenini kaldırabilirsiniz.
Simon Backx

1
Bir arka plan resmi kullanıyorsanız, layer.masksToBounds = trueayrıca ayarlayın
zontar

34
  1. Bir Cocoa Touch sınıfı oluşturun.

görüntü açıklamasını buraya girin

  1. Kodu RoundButton sınıfına ekleyin.

    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. Resme bakın.

görüntü açıklamasını buraya girin


Lütfen aynı cevabı tekrar tekrar göndermeyi bırakın. Bu gürültü olarak kabul edilir. Cevaplarınızı farklı sorulara göre özelleştirin ya da gerçekten aynı soruysa, onları kopya olarak işaretleyebilirsiniz (ve yeterince itibarınız olduğunda, kapatmak için oylayın).
elixenide

Başkalarının da bununla karşılaşıp karşılaşmadığını bilmiyorum, ancak sınıfı bir düğmeye ayarlayıp ona bir yarıçap, kenarlık genişliği ve sınır rengi verir vermez Xcode (9.2), işleme hatası olduğuna dair bir hata veriyor. Uygulama oluşturma başarılı ancak kırmızı "!" görüntülenmeye devam ediyor. Sadece söylüyorum ... Yalnızca kod çözümüne geri döndüm (bu gerçekten zarif bir yol olmasına rağmen).
Aeger

10

Bunu yapmanın en kolay yolunu buldum, cornerRadius'u görünümün yüksekliğinin yarısına ayarlamaktır.

button.layer.cornerRadius = button.bounds.size.height/2

Hayır yapmadım. Boyunuz ve genişliğiniz aynıysa (yani kare olurdu), o zaman bir daire elde edersiniz. Ancak genişlik yükseklikten büyükse düğme doğru olacaktır.
FrankkieNL

2
Haklısın, soruda yer alan ve yanıtın kabul edilen cevaptan çok sizin yanıtınızla eşleştikten sonra afişin gerçekte ne olduğunu gösteren resmi kaçırdım - ek oy
Michael Hudson

4

Bağlanabilirsin IBOutlet butonunu storyboard'dan .

O zaman ayarlayabilirsin corner radius köşeyi yuvarlak yapmak için düğmenizi .

örneğin, sizin outletise myButton, o zaman

Obj - C

 self.myButton.layer.cornerRadius = 5.0 ;

Swift

  myButton.layer.cornerRadius = 5.0

Sonra tam yuvarlak düğmeye istiyorsanız düğme var widthve heightolmalı equalve cornerRadius(genişlik veya yüksekliğinin yarısına) yüksekliği veya genişlik / 2 eşit olmalıdır.


4

Diğer yanıt, bu çalışmanın çoğunu kodda gerçekleştirmeyi önerdiğinden, yalnızca bir yanıt aslında film şeridi IB Arayüzündeki değişikliklerinizi görüntülemenin bir yolunu sağladı. Cevabım, görünümün köşe yarıçapını, düğmeyi, görüntünün vb. Değiştirmenize izin vererek bu cevabın ötesine geçiyor.

Lütfen aşağıdaki koda bir göz atın. Bu kodu kullanmak için, RoundedView adında yeni bir hızlı dosya oluşturun veya onu adlandırmak istediğiniz her ne olursa olsun, film şeridinize gidin ve sınıfı "RoundedView", "RoundedImageView" veya "RoundedButton" olarak değiştirin.

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
    }
}

1

layer.cornerRadiusFilm şeridine eklerken , başında veya sonunda boşluk olmadığından emin olun. Kopyalayıp yapıştırırsanız, boşluklar eklenebilir. XCode bir tür uyarı veya hata söylerse iyi olur.


0

Bunu dene!!

 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");
}

0

Uzantı, bu sorun için en iyi seçenektir. Görünüm veya Düğme uzantısı oluşturun

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

Koddan ara

button.roundCorners()

0

Xcode Sürüm 11.4 kullanıyorum

Nitelik denetçisinde köşe yarıçapını tanımlayabilirsiniz.

Öykü Panosunda görünmeyecek, ancak projeyi çalıştırdığınızda iyi çalışacaktır.

görüntü açıklamasını buraya girin


-1
import UIKit

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


    }

    func updateCornerRadius(radius:CGFloat) {
        layer.cornerRadius = radius
    }
    @IBInspectable var cornerRadius:CGFloat = 0{
        didSet{
            updateCornerRadius(radius: cornerRadius)
        }
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.