Giriş görünümümde bir UIActivityView
ve 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ı?
Giriş görünümümde bir UIActivityView
ve 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ı?
Yanıtlar:
Bunu dene
#import <QuartzCore/QuartzCore.h> // not necessary for 10 years now :)
...
view.layer.cornerRadius = 5;
view.layer.masksToBounds = true;
Not: Bir UIViewController
gö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 -viewDidLoad
sonra view
uygulanmalıdır.
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
. QuartzCore
Yine de kütüphaneyi eklediğinizden emin olun .
Bu hile, layer.borderWidth öğesinin ayarlanması için de çalışır, ancak bunun layer.borderColor
bir CGColor
a beklemediği için çalışmaz UIColor
.
Bu parametreler çalışma zamanında değerlendirildiğinden, film şeridindeki efektleri göremezsiniz.
Clip Subviews
görünüm IB için de seçeneği kontrol etmeyi unutmayın
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
}
}
}
@IBDesignable
IB'de canlı bir önizleme almak için onu etiketlediğinizden emin olun ! (Daha fazla nshipster.com/ibinspectable-ibdesignable adresinde )
Kısa cevap:
myView.layer.cornerRadius = 8
myView.layer.masksToBounds = true // optional
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)
Sen değiştirerek bunu yuvarlak köşeleri verebilir cornerRadius
görünümü en özelliğini layer
.
blueView.layer.cornerRadius = 8
Daha büyük yarıçap değerleri daha yuvarlatılmış köşeler verir
blueView.layer.cornerRadius = 25
ve daha küçük değerler daha az yuvarlatılmış köşeler verir.
blueView.layer.cornerRadius = 3
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
Ş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:
Hem clipsToBounds
ve masksToBounds
vardır eşdeğer . Sadece birincisi ile UIView
, ikincisi ile birlikte kullanılır CALayer
.
blueView.frame.size.height/2
) mükemmel bir şekilde yuvarlatılmış bir köşe ile sonuçlanmasını da eklemek isterim .
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!
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.
Ö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 - setMasksToBounds
aksi takdirde efekt gösterilmeyebilir.
UIView
Kenarlık rengini ve genişliğini de değiştirebilen aşağıdaki özel sınıfı kullanabilirsiniz . Bu şekilde IBDesignalbe
arayüz oluşturucudaki nitelikleri de değiştirebilirsiniz.
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
}
}
}
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];
@IBDesignable
class DesignableView: UIView {
}
extension UIView
{
@IBInspectable
var cornerRadius: CGFloat {
get {
return layer.cornerRadius
}
set {
layer.cornerRadius = newValue
}
}
}
layer.cornerRadius
orijinal durumuna geri döndürülmeyi nasıl önler ? (ei xcode'un storyboard'u cornerRadius
yalnızca orijinal UIView
başlatıldıktan sonra nasıl ayarlanacağını nasıl biliyor ?)
view.layer.cornerRadius = 25
view.layer.masksToBounds = true
SwiftUI'de, cornerRadius
değiştiriciyi doğrudan View
istediğiniz herhangi bir şekilde kullanabilirsiniz . Bu soru örneği:
Text("Signing In…")
.padding(16)
.background(Color.red)
.cornerRadius(50)
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
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;
}
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
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!
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];
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;
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)
}
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
}
}
ON Xcode 6 Denemeniz
self.layer.layer.cornerRadius = 5.0f;
veya
self.layer.layer.cornerRadius = 5.0f;
self.layer.clipsToBounds = YES;