CALayer未在设备/模拟器上显示

时间:2015-06-17 11:37:24

标签: ios objective-c

我创建了一个支持部分边框的自定义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

,这就是IB呈现我的文本字段的方式

ibrender

这就是设备/模拟器呈现它的方式:

enter image description here

右边框未呈现

知道为什么吗? 提前谢谢!

源代码可在此处获取:Gist

思考 - 我

我正在使用空的UIView来创建填充。

 //Padding

 UIView *paddingView = [[UIView alloc] initWithFrame:
                       CGRectMake(0, 0, 15, self.frame.size.height)];
 self.leftView = paddingView;
 self.leftViewMode = UITextFieldViewModeAlways;

这可能是问题的原因吗?

1 个答案:

答案 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和设备/模拟器上都能正确呈现。