Как получить текстовое поле с закругленными углами?
Я использую следующий код:
- (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()
}
}