2015-06-17 7 views
0

Я создал пользовательский UITextField, который поддерживает частичные границы:CALayer не отображается на устройстве/тренажере

@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; 
} 

Теперь вопрос.

Это как IB делает текстовое поле, если я изложу все пограничные свойства YES:

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; 

Не может быть причиной этой проблемы?

+0

Я подозреваю, что 'self.frame.size.width', вы можете использовать' self.bounds.size' вместо этого? – iphonic

+0

@iphonic Я пробовал это, к сожалению, ничего не меняется –

+0

Почему вы используете 4 слоя, когда 1 слой может выполнить эту работу? Разве это не случай рисования от 0 до 4 строк в слое-чертеже? – Droppy

ответ

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, так и устройство/симулятор.

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