UIView yuvarlak köşeler vermek


577

Giriş görünümümde bir UIActivityViewve bir UILabel"Oturum Açılıyor ..." ifadesi bulunan bir alt görünüm var . Bu alt görünümün köşeleri yuvarlatılmamış. Onları nasıl yuvarlak hale getirebilirim?

Bunu xibimin içinde yapmanın bir yolu var mı?


6
IB'de böyle bir şey yapmak, köşeleri yuvarlatılmış önceden oluşturulmuş bir görüntü gerektirir
Ed Marty

9
Mutlaka @ ed-marty, @ Gujamin'den gelen bu cevap , daha cornerRadiusönce oluşturulmuş görüntüleri kullanmadan veya kodda ayarlamak zorunda kalmadan, yalnızca Arayüz Oluşturucu'yu kullanarak özelliğin tabloya nasıl uygulanacağını gösterdiğinden, biraz daha fazla krediyi hak ediyor .
djskinner

Yanıtlar:


1219

Bunu dene

#import <QuartzCore/QuartzCore.h> // not necessary for 10 years now  :)

...

view.layer.cornerRadius = 5;
view.layer.masksToBounds = true;

Not: Bir UIViewControllergörünüme yuvarlatılmış köşeler uygulamaya çalışıyorsanız , görünüm denetleyicisinin yapıcısına değil , gerçekte somutlaştırıldıktan -viewDidLoadsonra viewuygulanmalıdır.


6
Özelliğin, önceki sürümlerde değil, yalnızca iPhone 3.0'da bulunduğunu unutmayın.
Kendall Helmstetter Gelner

5
Sadece bunun SO'da gördüğüm en tatmin edici cevaplardan biri olduğunu söylemeliyim. Burada kontrol ilk önce bana bir resim editörü ile mücadele bir saat kurtardı ve benim görünüm renk / boyutlandırma değişiklikleri için daha kırılgan olurdu. Teşekkürler!
Justin Searls

20
İlgili not: UIView'e kolayca başvurmak için daha görsel güzelliklerle (yani gölge) ilgilenen herkes CALayer sınıfı referansına bakmalıdır. Çoğu, yukarıdaki cevap gibi bir veya iki özellik değeri ayarlamak kadar kolaydır: developer.apple.com/mac/library/documentation/GraphicsImaging/…
Justin Searls

6
@Ben Collins (veya bu sorunu yaşayan başka biri), görünümünüzün "klip alt görünümleri" ayarlandığından emin olun. Bunu arayüz oluşturucuda kontrol edebilirsiniz.
zem

2
Bu harika çalışır, ancak bu yuvarlatılmış köşelerden herhangi bir kaydırma görünümünde veya animasyonda (UITableView'da kullanmayı denedim) bir sürü varsa, performansınız büyük ölçüde acı çekecektir. Güzel pürüzsüz kaydırma tablo görünümü hızla dalgalı olur :(
Slee

261

Ayrıca , anahtar yolunu bir değere ayarlamak için arabirim oluşturucunun Kullanıcı Tanımlı Çalışma Zamanı Öznitelikleri özelliğini de kullanabilirsiniz layer.cornerRadius. QuartzCoreYine de kütüphaneyi eklediğinizden emin olun .

Bu hile, layer.borderWidth öğesinin ayarlanması için de çalışır, ancak bunun layer.borderColorbir CGColora beklemediği için çalışmaz UIColor.

Bu parametreler çalışma zamanında değerlendirildiğinden, film şeridindeki efektleri göremezsiniz.

Köşe yarıçapını ayarlamak için Arayüz oluşturucuyu kullanma


10
Clip Subviewsgörünüm IB için de seçeneği kontrol etmeyi unutmayın
Peter

2
(veya) Anahtar Yol ekleyin: layer.masksToBounds, Tür: boolean: İşaretli
Amitabh

64

Artık sonucu film şeridinde göstermek için UIBiew'de (resmin altındaki kod) hızlı bir kategori kullanabilirsiniz (Kategoriyi kullanıyorsanız, anahtar yol olarak layer.cornerRadius'u değil yalnızca cornerRadius'u kullanın.

extension UIView {
    @IBInspectable var cornerRadius: CGFloat {
        get {
            return layer.cornerRadius
        }
        set {
            layer.cornerRadius = newValue
            layer.masksToBounds = newValue > 0
        }
    }
}

resim açıklamasını buraya girin


Özel bir alt sınıf kullanıyorsanız, @IBDesignableIB'de canlı bir önizleme almak için onu etiketlediğinizden emin olun ! (Daha fazla nshipster.com/ibinspectable-ibdesignable adresinde )
clozach

56

hızlı

Kısa cevap:

myView.layer.cornerRadius = 8
myView.layer.masksToBounds = true  // optional

Tamamlayıcı Cevap

Bu yanıta geldiyseniz, muhtemelen sorununuzu çözecek kadarıyla gördünüz. Bu cevabı, işlerin neden yaptıkları şeyi yaptıkları hakkında biraz daha görsel bir açıklama yapmak için ekliyorum.

Düzenli bir UIViewşekilde başlarsanız , kare köşeleri vardır.

let blueView = UIView()
blueView.frame = CGRect(x: 100, y: 100, width: 100, height: 50)
blueView.backgroundColor = UIColor.blueColor()
view.addSubview(blueView)

resim açıklamasını buraya girin

Sen değiştirerek bunu yuvarlak köşeleri verebilir cornerRadiusgörünümü en özelliğini layer.

blueView.layer.cornerRadius = 8

resim açıklamasını buraya girin

Daha büyük yarıçap değerleri daha yuvarlatılmış köşeler verir

blueView.layer.cornerRadius = 25

resim açıklamasını buraya girin

ve daha küçük değerler daha az yuvarlatılmış köşeler verir.

blueView.layer.cornerRadius = 3

resim açıklamasını buraya girin

Bu, sorununuzu orada çözmek için yeterli olabilir. Bununla birlikte, bazen bir görünümde, görünümün sınırlarının dışına çıkan bir alt görünüm veya bir alt katman olabilir. Örneğin, böyle bir alt görünüm ekleseydim

let mySubView = UIView()
mySubView.frame = CGRect(x: 20, y: 20, width: 100, height: 100)
mySubView.backgroundColor = UIColor.redColor()
blueView.addSubview(mySubView)

veya böyle bir alt katman ekleseydim

let mySubLayer = CALayer()
mySubLayer.frame = CGRect(x: 20, y: 20, width: 100, height: 100)
mySubLayer.backgroundColor = UIColor.redColor().CGColor
blueView.layer.addSublayer(mySubLayer)

Sonra bitiririm

resim açıklamasını buraya girin

Şimdi, eğer sınırların dışında bir şeylerin asılmasını istemiyorsam, bunu yapabilirim

blueView.clipsToBounds = true

veya bu

blueView.layer.masksToBounds = true

Bu da bu sonucu verir:

resim açıklamasını buraya girin

Hem clipsToBoundsve masksToBoundsvardır eşdeğer . Sadece birincisi ile UIView, ikincisi ile birlikte kullanılır CALayer.

Ayrıca bakınız


4
Köşe yarıçapının daha kısa tarafın yarısına (bu durumda blueView.frame.size.height/2) mükemmel bir şekilde yuvarlatılmış bir köşe ile sonuçlanmasını da eklemek isterim .
Johann Burgess

44

Ed Marty'nin yaptığı yaklaşımdan farklı bir yaklaşım:

#import <QuartzCore/QuartzCore.h>

[v.layer setCornerRadius:25.0f];
[v.layer setMasksToBounds:YES];

IB tüm nesneleri yüklemek için setMasksToBounds gerekir ... benim görüş yuvarlandı, ancak IB nesneler yoktu bir sorun var: /

Bu düzeltildi = D umut yardımcı olur!


48
Nasıl farklı? nokta sözdizimi kullanmamaktan başka?
user102008

3
[v.layer setMasksToBounds: YES]; \ n bu çizgi büyü, benim büyük sorunumu çözdü
Cullen SUN

3
İOS geliştirmeye başladığımda bunu yazdım ve nokta sözdizimi ile köşeli ayraç sözdizimi arasında bir fark olmadığını bilmiyordum. Bu yüzden onu "farklı" olarak yazdım. Kodum ayrıca Ed Marty'nin orijinal yanıtında (daha sonra düzenlenmiş) sahip olmadığı içe aktarmayı da içeriyordu.
Kristian Flatheim Jensen

28

Bu blog gönderisinde açıklandığı gibi , bir UIView'in köşelerini yuvarlamak için bir yöntem:

+(void)roundView:(UIView *)view onCorner:(UIRectCorner)rectCorner radius:(float)radius
{
    UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:view.bounds
                                                   byRoundingCorners:rectCorner
                                                         cornerRadii:CGSizeMake(radius, radius)];
    CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
    maskLayer.frame = view.bounds;
    maskLayer.path = maskPath.CGPath;
    [view.layer setMask:maskLayer];
    [maskLayer release];
}

Bununla ilgili havalı kısım, hangi köşeleri yuvarlamak istediğinizi seçebilmenizdir.


6
Harici bir siteye bağlantı vermek yerine, cevapların burada yer almasını tercih ediyoruz, bu yüzden bağlantılı blog yayınındaki ilgili kodu cevabınıza getirdim. İnsanlar daha fazla ayrıntı için blog yayınını ziyaret edebilir, ancak bu, söz konusu yayın kaybolursa içeriğin hayatta kalacağından emin olur. Ayrıca, bu yanıtı gerçekten aynı şeyi sormayan birkaç farklı soruya gönderdiniz. Bunlar çıkarıldı ve bir soru bunun bir kopyası olarak kapatıldı. Her soruya uygun cevaplar hazırlamayı seviyoruz.
Brad Larson

5
Önsezilidir. Blog yazısı 404 oldu.
Anthony C

Bu yaklaşım Temizdir, ancak görünümdeki gölge efektlerini gizler.
thesummersign

19

Önce başlık dosyasını içe aktarmanız gerekir <QuartzCore/QuartzCore.h>

 #import QuartzCore/QuartzCore.h>

[yourView.layer setCornerRadius:8.0f];
yourView.layer.borderColor = [UIColor redColor].CGColor;
yourView.layer.borderWidth = 2.0f;
[yourView.layer setMasksToBounds:YES];

Kullanmayı kaçırmayın - setMasksToBoundsaksi takdirde efekt gösterilmeyebilir.


2
"QuartzCore / QuartzCore.h" dosyasını içe aktarmanıza gerek yok
Sudhir Kumar

Evet, içe aktarmanız gerekiyor.
Lord Zsolt

3
@LordZsolt Belki iOS7 ile değiştirdiler, ancak artık QuartzCore'u içe aktarmanıza gerek yok.
Marc

14

UIViewKenarlık rengini ve genişliğini de değiştirebilen aşağıdaki özel sınıfı kullanabilirsiniz . Bu şekilde IBDesignalbearayüz oluşturucudaki nitelikleri de değiştirebilirsiniz.

resim açıklamasını buraya girin

import UIKit

@IBDesignable public class RoundedView: UIView {

    @IBInspectable var borderColor: UIColor = UIColor.white {
        didSet {
            layer.borderColor = borderColor.cgColor
        }
    }

    @IBInspectable var borderWidth: CGFloat = 2.0 {
        didSet {
            layer.borderWidth = borderWidth
        }
    }

    @IBInspectable var cornerRadius: CGFloat = 0.0 {
        didSet {
            layer.cornerRadius = cornerRadius
        }
    }

}

6
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(20, 50, 200, 200)];

view.layer.backgroundColor = [UIColor whiteColor].CGColor;
view.layer.cornerRadius = 20.0;
view.layer.frame = CGRectInset(v.layer.frame, 20, 20);

view.layer.shadowOffset = CGSizeMake(1, 0);
view.layer.shadowColor = [[UIColor blackColor] CGColor];
view.layer.shadowRadius = 5;
view.layer.shadowOpacity = .25;

[self.view addSubview:view];
[view release];

SetMasksToBounds uygulaması önemlidir. Bir arka plan rengi ve alt gölge ayarlamak değildir.
djskinner

3

Swift 4 - IBDesignable'ı kullanma

   @IBDesignable
    class DesignableView: UIView {
    }

    extension UIView
    {

        @IBInspectable
        var cornerRadius: CGFloat {
            get {
                return layer.cornerRadius
            }
            set {
            layer.cornerRadius = newValue
        }
    }
}

Üzgünüm, ama IOS gelişimine yeni gelen biri olarak. Çözüm layer.cornerRadiusorijinal durumuna geri döndürülmeyi nasıl önler ? (ei xcode'un storyboard'u cornerRadiusyalnızca orijinal UIViewbaşlatıldıktan sonra nasıl ayarlanacağını nasıl biliyor ?)
AlanSTACK


3

- SwiftUI

SwiftUI'de, cornerRadiusdeğiştiriciyi doğrudan Viewistediğiniz herhangi bir şekilde kullanabilirsiniz . Bu soru örneği:

Text("Signing In…")
    .padding(16)
    .background(Color.red)
    .cornerRadius(50)

Ön izleme

Not olduğunu sen CornerRadius ayarlanmış yüzden bile, yarıçap gibi artık elmas yoktur daha yüksekliğinin yarısından sorunsuz yuvarlak, olacaktır.

Ödemeye bu cevabı nasıl se için Yuvarlak Özgü Corners SwiftUI içinde


2

İçe Lütfen Quartzcore frameworksen setine sahip sonra setMaskToBoundsiçinTRUE bu önemli satırı .

Sonra: [[yourView layer] setCornerRadius:5.0f];


2
UIView* viewWithRoundedCornersSize(float cornerRadius,UIView * original)
{
    // Create a white border with defined width
    original.layer.borderColor = [UIColor yellowColor].CGColor;
    original.layer.borderWidth = 1.5;

    // Set image corner radius
    original.layer.cornerRadius =cornerRadius;

    // To enable corners to be "clipped"
    [original setClipsToBounds:YES];
    return original;
}

2

Bunu objektif olarak program c

UIView *view = [[UIView alloc] initWithFrame:CGRectMake(20, 50,    200, 200)];

view.layer.backgroundColor = [UIColor whiteColor].CGColor;
view.layer.cornerRadius = 20.0;
view.layer.frame = CGRectInset(v.layer.frame, 20, 20);

[view.layer.shadowOffset = CGSizeMake(1, 0);
view.layer.shadowColor = [[UIColor blackColor] CGColor];
view.layer.shadowRadius = 5;
view.layer.shadowOpacity = .25;][1]

[self.view addSubview:view];

Bunu Stoaryboard'dan da Yapabiliriz.

 layer.cornerRadius  Number  5

resim açıklamasını buraya girin


2

yuvarlak köşe viewDidload () ' da çalışmıyorsa viewDidLayoutSubview ()' da kod yazmak daha iyidir

-(void)viewDidLayoutSubviews
{
    viewTextfield.layer.cornerRadius = 10.0 ;                                               
    viewTextfield.layer.borderWidth = 1.0f;
    viewTextfield.layer.masksToBounds =  YES;
    viewTextfield.layer.shadowRadius = 5;
    viewTextfield.layer.shadowOpacity = 0.3;
    viewTextfield.clipsToBounds = NO;
    viewTextfield.layer.shadowOffset = CGSizeMake(0.0f, 0.0f);
}

Bu yardımcı olur umarım!


0

Ayrıca bir resim de kullanabilirsiniz:

UIImage *maskingImage = [UIImage imageNamed:@"bannerBarBottomMask.png"];
CALayer *maskingLayer = [CALayer layer];
maskingLayer.frame = CGRectMake(-(self.yourView.frame.size.width - self.yourView.frame.size.width) / 2
                                , 0
                                , maskingImage.size.width
                                , maskingImage.size.height);
[maskingLayer setContents:(id)[maskingImage CGImage]];
[self.yourView.layer setMask:maskingLayer];

0

yuvarlak görünüm için köşe özelliği

masksToBounds Boolean Görüntünün değeri hala köşe yarıçapı sınırının dışına çizilmeyecek

view.layer.cornerRadius = 5;

view.layer.masksToBounds = YES;

0

UIView Uzantısını Kullanma:

extension UIView {    

func addRoundedCornerToView(targetView : UIView?)
{
    //UIView Corner Radius
    targetView!.layer.cornerRadius = 5.0;
    targetView!.layer.masksToBounds = true

    //UIView Set up boarder
    targetView!.layer.borderColor = UIColor.yellowColor().CGColor;
    targetView!.layer.borderWidth = 3.0;

    //UIView Drop shadow
    targetView!.layer.shadowColor = UIColor.darkGrayColor().CGColor;
    targetView!.layer.shadowOffset = CGSizeMake(2.0, 2.0)
    targetView!.layer.shadowOpacity = 1.0
}
}

Kullanımı:

override func viewWillAppear(animated: Bool) {

sampleView.addRoundedCornerToView(statusBarView)

}

0

Swift 4.2 ve Xcode 10.1'de

let myView = UIView()
myView.frame = CGRect(x: 200, y: 200, width: 200, height: 200)
myView.myViewCorners()
//myView.myViewCorners(width: myView.frame.width)//Pass View width
view.addSubview(myView)

extension UIView {
    //If you want only round corners
    func myViewCorners() {
        layer.cornerRadius = 10
        layer.borderWidth = 1.0
        layer.borderColor = UIColor.red.cgColor
        layer.masksToBounds = true
    }
    //If you want complete round shape, enable above comment line
    func myViewCorners(width:CGFloat) {
        layer.cornerRadius = width/2
        layer.borderWidth = 1.0
        layer.borderColor = UIColor.red.cgColor
        layer.masksToBounds = true
    }
}

-4

ON Xcode 6 Denemeniz

     self.layer.layer.cornerRadius = 5.0f;

veya

    self.layer.layer.cornerRadius = 5.0f;
    self.layer.clipsToBounds = YES;
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.