我创建了一个支持部分边框的自定义UITextField:
@import UIKit;
IB_DESIGNABLE
@interface TextField : UITextField
@property (nonatomic, strong) IBInspectable UIColor* borderColor;
@property (nonatomic, assign) IBInspectable CGFloat borderWidth;
@property (nonatomic, assign) IBInspectable BOOL topBorder;
@property (nonatomic, assign) IBInspectable BOOL rightBorder;
@property (nonatomic, assign) IBInspectable BOOL bottomBorder;
@property (nonatomic, assign) IBInspectable BOOL leftBorder;
@end
每个边框都实现为CALayer:
@interface TextField ()
@property (nonatomic, strong) CALayer *topBorderLayer;
@property (nonatomic, strong) CALayer *rightBorderLayer;
@property (nonatomic, strong) CALayer *bottomBorderLayer;
@property (nonatomic, strong) CALayer *leftBorderLayer;
@end
当BOOL
值设置为YES
时,会创建相关图层并将其作为子图层添加到文本字段中。
E.g。如果我们将topBorder
设置为YES
:
- (void)setTopBorder:(BOOL)topBorder
{
if (topBorder) {
self.topBorderLayer = [CALayer layer];
self.topBorderLayer.backgroundColor = [self.borderColor CGColor];
self.topBorderLayer.frame =
CGRectMake(0, 0, self.frame.size.width, self.borderWidth);
[self.layer addSublayer:self.topBorderLayer];
} else {
[self.topBorderLayer removeFromSuperlayer];
self.topBorderLayer = nil;
}
_topBorder = topBorder;
}
现在,问题。
如果我将所有边框属性设置为YES
:
这就是设备/模拟器呈现它的方式:
右边框未呈现
知道为什么吗? 提前谢谢!
源代码可在此处获取:Gist
思考 - 我
我正在使用空的UIView来创建填充。
//Padding
UIView *paddingView = [[UIView alloc] initWithFrame:
CGRectMake(0, 0, 15, self.frame.size.height)];
self.leftView = paddingView;
self.leftViewMode = UITextFieldViewModeAlways;
这可能是问题的原因吗?
答案 0 :(得分:1)
我已从 CALayer 切换到 CoreGraphics 。
完成工作。
- (void)drawRect:(CGRect)rect
{
CGContextRef context = UIGraphicsGetCurrentContext();
if (self.topBorder) {
CGContextMoveToPoint(context, CGRectGetMinX(rect), CGRectGetMinY(rect));
CGContextAddLineToPoint(context, CGRectGetMaxX(rect), CGRectGetMinY(rect));
CGContextSetStrokeColorWithColor(context, [self.borderColor CGColor] );
CGContextSetLineWidth(context, self.borderWidth);
CGContextStrokePath(context);
}
if (self.rightBorder) {
CGContextMoveToPoint(context, CGRectGetMaxX(rect), CGRectGetMinY(rect));
CGContextAddLineToPoint(context, CGRectGetMaxX(rect), CGRectGetMaxY(rect));
CGContextSetStrokeColorWithColor(context, [self.borderColor CGColor] );
CGContextSetLineWidth(context, self.borderWidth);
CGContextStrokePath(context);
}
if (self.bottomBorder) {
CGContextMoveToPoint(context, CGRectGetMaxX(rect), CGRectGetMaxY(rect));
CGContextAddLineToPoint(context, CGRectGetMinX(rect), CGRectGetMaxY(rect));
CGContextSetStrokeColorWithColor(context, [self.borderColor CGColor] );
CGContextSetLineWidth(context, self.borderWidth);
CGContextStrokePath(context);
}
if (self.leftBorder) {
CGContextMoveToPoint(context, CGRectGetMinX(rect), CGRectGetMaxY(rect));
CGContextAddLineToPoint(context, CGRectGetMinX(rect), CGRectGetMinY(rect));
CGContextSetStrokeColorWithColor(context, [self.borderColor CGColor] );
CGContextSetLineWidth(context, self.borderWidth);
CGContextStrokePath(context);
}
}
现在它在IB和设备/模拟器上都能正确呈现。