2016-09-12 7 views
0

Я пишу UITextField с кодом в файле с именем login.mКак правильно подклассифицировать класс в ObjectiveC?

_textfield1 = [[UITextField alloc] initWithFrame:CGRectMake(50, 60, self.view.frame.size.width-50*2, 44)]; 
    _textfield1.placeholder = @"email"; 
    _textfield1.font = [UIFont systemFontOfSize:14.0f]; 
    _textfield1.delegate = self; 
    UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:_textfield1.bounds byRoundingCorners:UIRectCornerTopLeft|UIRectCornerTopRight cornerRadii:CGSizeMake(4, 4)]; 
    CAShapeLayer *maskLayer = [CAShapeLayer layer]; 
    maskLayer.frame = _textfield1.bounds; 
    maskLayer.path = maskPath.CGPath; 
    _textfield1.layer.mask = maskLayer; 
    [self.view addSubview:_textfield1]; 

и я подкласс UITextField с именем 'NewTextField', NewTextField.h

 #import <UIKit/UIKit.h> 
    @interface NewTextField : UITextField 
    @end 

NewTextField.m

 #import "NewTextField.h" 
    @implementation NewTextField 
    - (void)setMaskView:(UIView *)maskView { 
     UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:maskView.bounds byRoundingCorners:UIRectCornerBottomLeft|UIRectCornerBottomRight cornerRadii:CGSizeMake(4, 4)]; 
     CAShapeLayer *maskLayer = [CAShapeLayer layer]; 
     maskLayer.frame = maskView.bounds; 
     maskLayer.path = maskPath.CGPath; 
     maskView.layer.mask = maskLayer; 
    } 
    @end 

в файле login.m, i обновить код

_textfield1 = [[NewTextField alloc] initWithFrame:CGRectMake(50, 60, self.view.frame.size.width-50*2, 44)]; 
    _textfield1.placeholder = @"email"; 
    _textfield1.font = [UIFont systemFontOfSize:14.0f]; 
    _textfield1.delegate = self; 
    [_textfield1 setMaskView:_textfield1]; 
    [self.view addSubview:_textfield1]; 

это работает, но я не думаю, что это правильный путь. так как я могу правильно подклассифицировать класс?

+0

Почему, по вашему мнению, это неправильно? Какие проблемы вы наблюдаете? – Avi

+1

Не должно быть '_textfield1 = [[NewTextField alloc] ....' после того, как вы обновили свой код? – Tj3n

+0

@Avi здесь так bizarrerie в строке [_textfield1 setMaskView: _textfield1]; – yeleko

ответ

0

В NewTextField.m вместо - (ничтожной) setMaskView: (UIView *) maskView написать метод инициализации, как показано ниже,

- (instancetype)initWithFrame:(CGRect)frame { 
    self = [super initWithFrame:frame]; 
    if (self) { 
     UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:self.bounds byRoundingCorners:UIRectCornerBottomLeft|UIRectCornerBottomRight cornerRadii:CGSizeMake(4, 4)]; 
     CAShapeLayer *maskLayer = [CAShapeLayer layer]; 
     maskLayer.frame = self.bounds; 
     maskLayer.path = maskPath.CGPath; 
     self.layer.mask = maskLayer; 
    } 
    return self; 
} 
0

Технически нет никаких проблем с подклассов UITextField как вы сделали, может быть, Я заявляю очевидное, потому что вы сказали нам, что это работает: D.

Однако, если вы планируете добавить маску к UITextField, для подкласса UITextField не нужно подклассифицировать UITextField, возможно, просто создайте вспомогательный метод или категорию, чтобы добавить маску к текстовому полю, что похоже на более чистый подход.