Давать UIView закругленные углы

У моего вида входа в систему есть подпредставление, в котором UIActivityView и UILabel с надписью "Вход в систему ...". У этого подпредставления есть углы, которые не округлены. Как я могу сделать их круглыми?

Есть ли способ сделать это внутри моей XIB?

вопрос задан 2.10.2009
itsaboutcode
9473 репутация

19 ответов


  • 1158 рейтинг

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

    #import  // not necessary for 10 years now  :)
    

    . , ,

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

    Примечание. Если вы пытаетесь применить закругленные углы к представлению UIViewController, его следует применять не в конструкторе контроллера представления, а в -viewDidLoad, после того, как view будет фактически создан.

    ответ дан Ed Marty, с репутацией 34936, 2.10.2009
  • 249 рейтинг

    Вы также можете использовать Определяемые пользователем атрибуты времени выполнения функции конструктора интерфейса для установки значения пути ключа layer.cornerRadius. Убедитесь, что вы включили библиотеку QuartzCore.

    Этот прием также работает для настройки слоя. borderWidth, однако, он не будет работать для layer.borderColor, так как ожидается CGColor, а не UIColor.

    Вы не сможете увидеть эффекты в раскадровке, поскольку эти параметры оцениваются во время выполнения.

    Using Interface builder to set the corner radius

    ответ дан Gujamin, с репутацией 3570, 15.07.2012
  • 58 рейтинг

    Теперь вы можете использовать быструю категорию в UIView (код под картинкой) в @IBInspectable, чтобы показать результат на раскадровке (Если вы используете категорию, используйте только cornerRadius, а не слой. cornerRadius в качестве ключевого пути.

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

    enter image description here

    ответ дан Guilherme Torres Castro, с репутацией 8887, 16.01.2014
  • 43 рейтинг

    Другой подход, чем тот, который сделал Эд Марти:

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

    Вам нужен setMasksToBounds, чтобы загрузить все объекты из IB. , , у меня возникла проблема, когда мой взгляд округлился, но не было объектов из IB: /

    это исправило это = D надеюсь, это поможет!

    ответ дан Kristian Flatheim Jensen, с репутацией 808, 9.12.2010
  • 37 рейтинг

    Swift

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

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

    Дополнительный ответ

    Если вы пришли к этому ответу, вы, вероятно, уже видели достаточно, чтобы решить вашу проблему. Я добавляю этот ответ, чтобы дать немного более наглядное объяснение того, почему вещи делают то, что делают.

    Если вы начинаете с обычного UIView, у него есть квадратные углы.

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

    enter image description here

    Вы можете дать ему закругленные углы, изменив свойство cornerRadius layer представления.

    blueView.layer.cornerRadius = 8
    

    enter image description here

    Большие значения радиуса дают более закругленные углы

    blueView.layer.cornerRadius = 25
    

    enter image description here

    и меньшие значения дают меньше закругленных углов.

    blueView.layer.cornerRadius = 3
    

    enter image description here

    Этого может быть достаточно, чтобы решить вашу проблему прямо здесь. Однако иногда представление может иметь подпредставление или подслой, выходящий за пределы представления. Например, если бы я добавил подпункт , например

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

    или если бы я должен был добавить вспомогательный слой , как это

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

    Тогда я бы в конечном итоге с

    enter image description here

    Теперь, если я не хочу, чтобы вещи висели за пределами границ, я могу сделать это

    blueView.clipsToBounds = true
    

    или этот

    blueView.layer.masksToBounds = true
    

    который дает этот результат:

    enter image description here

    И clipsToBounds, и masksToBounds являются эквивалентными . Просто первый используется с UIView, а второй - с CALayer.

    См. Также

    ответ дан Suragch, с репутацией 180669, 25.01.2016
  • 26 рейтинг

    Как описано в этом сообщении в блоге , вот метод, чтобы закруглить углы UIView:

    +(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];
    }
    

    Самое интересное в этом то, что вы можете выбрать, какие углы вы хотите округлить.

    ответ дан pabloruiz55, с репутацией 1063, 10.09.2012
  • 19 рейтинг

    Необходимо сначала импортировать файл заголовка

     #import QuartzCore/QuartzCore.h>
    
    [yourView.layer setCornerRadius:8.0f];
    yourView.layer.borderColor = [UIColor redColor].CGColor;
    yourView.layer.borderWidth = 2.0f;
    [yourView.layer setMasksToBounds:YES];
    

    Не пропустите использовать - setMasksToBounds, в противном случае эффект может не отображаться.

    ответ дан Samir Jwarchan, с репутацией 957, 1.08.2012
  • 8 рейтинг

    Вы можете использовать следующий пользовательский класс UIView, который также может изменять цвет и ширину границы. Так как это IBDesignalbe Вы также можете изменить атрибуты в конструкторе интерфейса.

    enter image description here

    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
            }
        }
    
    }
    
    ответ дан Vakas, с репутацией 3210, 26.10.2016
  • 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];
    
    ответ дан jorik, с репутацией 565, 23.05.2012
  • 3 рейтинг
    view.layer.cornerRadius = 25
    view.layer.masksToBounds = true
    
    ответ дан Parth Barot, с репутацией 103, 16.04.2018
  • 2 рейтинг

    Пожалуйста, импортируйте Quartzcore framework, тогда вам нужно установить setMaskToBounds на TRUE, это очень важная строка.

    Тогда: [[yourView layer] setCornerRadius:5.0f];

    ответ дан DeveshM, с репутацией 361, 16.02.2013
  • 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;
    }
    
    ответ дан Ashish Patel, с репутацией 334, 2.09.2014
  • 2 рейтинг

    Swift 4 - Использование IBDesignable

       @IBDesignable
        class DesignableView: UIView {
        }
    
        extension UIView
        {
    
            @IBInspectable
            var cornerRadius: CGFloat {
                get {
                    return layer.cornerRadius
                }
                set {
                layer.cornerRadius = newValue
            }
        }
    }
    
    ответ дан Saranjith, с репутацией 3803, 24.10.2017
  • 1 рейтинг

    Сделайте это программно в obj 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];
    

    Мы также можем сделать это из сториборда.

     layer.cornerRadius  Number  5
    

    enter image description here

    ответ дан Vikas Rajput, с репутацией 399, 9.02.2017
  • 1 рейтинг

    , если в не работает круглый угол viewDidload () , лучше написать код в viewDidLayoutSubview ()

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

    Надеюсь, это поможет!

    ответ дан Dharmesh Mansata, с репутацией 337, 21.04.2018
  • 0 рейтинг

    set cornerRadious Недвижимость для тура View

    set masksToBounds Boolean Значение для изображения по-прежнему не будет отрисовываться за пределами границы углового радиуса

    view.layer.cornerRadius = 5;
    
    view.layer.masksToBounds = YES;
    
    ответ дан bhautikmewada191, с репутацией 425, 29.12.2014
  • 0 рейтинг

    Вы также можете использовать изображение:

    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];
    
    ответ дан richy, с репутацией 1795, 24.01.2013
  • -1 рейтинг

    Использование расширения UIView:

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

    Использование:

    override func viewWillAppear(animated: Bool) {
    
    sampleView.addRoundedCornerToView(statusBarView)
    
    }
    
    ответ дан A.G, с репутацией 9857, 11.05.2016
  • -4 рейтинг

    ON Xcode 6 Ваша попытка

         self.layer.layer.cornerRadius = 5.0f;
    

    или

        self.layer.layer.cornerRadius = 5.0f;
        self.layer.clipsToBounds = YES;
    
    ответ дан Saringkhan Vungsin, с репутацией 1, 28.11.2014