2016-11-07 4 views
1

This is textfield which I get right nowКак получить текстовое поле с закругленными углами?

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

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

Вопрос - закругленные углы, обрезанные.

+0

почему бы вам не использовать layer.corner.raius для сделай это? – SeanChense

+0

Откуда вы вызываете этот метод? – alexburtnik

+0

@alexburtnik - (void) viewDidLayoutSubviews { [self initUIfeatures]; } - (пустоты) initUIfeatures { [authTextField setMaskByRoundingCorners: (UIRectCornerTopLeft | UIRectCornerTopRight | UIRectCornerBottomLeft) withCornerRadius: 8.0f]; } – Viktorianec

ответ

1

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

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

Ref

SourceCode

+0

Хороший рабочий человек [снова]! – Viktorianec

0

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

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

} 
Смежные вопросы