Я создал пользовательский 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
:
И это, как устройство/имитатор делает это:
Правая рамка не отображается
Любая идея, почему? Спасибо заранее!
Исходный код доступен здесь: Gist
Мысли - Я
Я использую пустой UIView, чтобы создать отступы.
//Padding
UIView *paddingView = [[UIView alloc] initWithFrame:
CGRectMake(0, 0, 15, self.frame.size.height)];
self.leftView = paddingView;
self.leftViewMode = UITextFieldViewModeAlways;
Не может быть причиной этой проблемы?
Я подозреваю, что 'self.frame.size.width', вы можете использовать' self.bounds.size' вместо этого? – iphonic
@iphonic Я пробовал это, к сожалению, ничего не меняется –
Почему вы используете 4 слоя, когда 1 слой может выполнить эту работу? Разве это не случай рисования от 0 до 4 строк в слое-чертеже? – Droppy