Как получить текстовое поле с закругленными углами?

Это текстовое поле, которое я получаю прямо сейчас

Я использую следующий код:

- (void)setMaskByRoundingCorners:(UIRectCorner)corners withCornerRadius:(float)radius
    {
        UIBezierPath* rounded = [UIBezierPath bezierPathWithRoundedRect:self.bounds byRoundingCorners:corners cornerRadii:CGSizeMake(radius, radius)];

        CAShapeLayer* shape = [[CAShapeLayer alloc] init];
        [shape setPath:rounded.CGPath];
        shape.frame = self.bounds;
        self.layer.mask = shape;
    }

Но теперь я вижу этот странный эффект.

Я называю это из viewcontroller, после того, как didlayoutsubviews. Я делаю это для обновления основного потока.

- (void)viewDidLayoutSubviews
{
    [self initUIfeatures];
}

- (void)initUIfeatures
{
    [authTextField setMaskByRoundingCorners:(UIRectCornerTopLeft|UIRectCornerTopRight|UIRectCornerBottomLeft) withCornerRadius:8.0f]; 
}

Проблема заключается в том, что закругленные углы обрезаются.

2 ответа

Решение

Добавьте эти функции,

-(void)roundCorners:(UIRectCorner)corners radius:(CGFloat)radius
{
    CGRect bounds = _IBtxtField.bounds;
    UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:bounds
                                                   byRoundingCorners:corners
                                                         cornerRadii:CGSizeMake(radius, radius)];

    CAShapeLayer *maskLayer = [CAShapeLayer layer];
    maskLayer.frame = bounds;
    maskLayer.path = maskPath.CGPath;

    _IBtxtField.layer.mask = maskLayer;

    CAShapeLayer*   frameLayer = [CAShapeLayer layer];
    frameLayer.frame = bounds;
    frameLayer.path = maskPath.CGPath;
    frameLayer.strokeColor = [UIColor blackColor].CGColor;
    frameLayer.fillColor = nil;

    [_IBtxtField.layer addSublayer:frameLayer];
}

-(void)roundCornersRadius:(CGFloat)radius
{
    [self roundCorners:(UIRectCornerTopLeft|UIRectCornerTopRight | UIRectCornerBottomLeft) radius:radius];
}

Используйте как это,

[self roundCornersRadius:10];

ссылка

Исходный код

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

import UIKit

@IBDesignable
class CustomRoundedTextField: UITextField {

    @IBInspectable var lColor: UIColor = UIColor(red: (37.0/255.0), green: (252.0/255), blue: (244.0/255.0), alpha: 1.0)
    @IBInspectable var lWidth: CGFloat = 1
    @IBInspectable var lCornerRadius: CGFloat = 8
    @IBInspectable var sColor:UIColor = UIColor(red: (37.0/255.0), green: (252.0/255), blue: (244.0/255.0), alpha: 1.0)
    @IBInspectable var TLRCorner:Bool = false
    @IBInspectable var TRRCorner:Bool = false
    @IBInspectable var BLRCorner:Bool = false
    @IBInspectable var BRRCorner:Bool = false
    @IBInspectable var XInset:CGFloat = 10
    @IBInspectable var YInset:CGFloat = 10

    required internal init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
    }

    override internal func drawRect(rect: CGRect) {
        addBorderFieldRect()
    }

    override func textRectForBounds(bounds: CGRect) -> CGRect {
        return CGRectInset(bounds, XInset, 0)
    }

    override func editingRectForBounds(bounds: CGRect) -> CGRect {
        return CGRectInset(bounds, YInset, 0)
    }

    func addBorderFieldRect() {
        let rectanglePath = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: [
            TLRCorner ? .TopLeft : [],
            TRRCorner ? .TopRight : [],
            BLRCorner ? .BottomLeft : [],
            BRRCorner ? .BottomRight : []
            ], cornerRadii: CGSizeMake(lCornerRadius, lCornerRadius))
        rectanglePath.closePath()
        self.lColor.setFill()
        rectanglePath.fill()
        self.sColor.setStroke()
        rectanglePath.lineWidth = lWidth
        rectanglePath.stroke()
    }

}
Другие вопросы по тегам