2016-09-12 5 views
0

schreibe ich eine UITextField mit dem Code in der Datei login.m genanntWie Unterklasse eine Klasse in ObjectiveC korrekt?

_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]; 

und i Unterklasse UITextField mit dem Namen '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 

in Datei login.m, ich aktualisiere Code

_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]; 

es funktioniert, aber ich denke nicht, dass es ein richtiger Weg ist. Wie kann ich eine Klasse in der richtigen Weise ableiten?

+0

Warum denken Sie, dass es falsch ist? Welche Probleme beobachtest du? – Avi

+1

Sollte es nicht '_textfield1 = [[NewTextField alloc] ....' nachdem Sie Ihren Code aktualisiert haben? – Tj3n

+0

@Avi hier ist so bizarrerie in der Zeile [_textfield1 setMaskView: _textfield1]; – yeleko

Antwort

0

In NewTextField.m statt - (void) setMaskView: (UIView *) eine initializer Methode als Gebrüll, es

- (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

Technisch maskView schreiben ist kein Problem mit Subklassifizieren UITextField wie Sie, vielleicht getan haben Ich sage das Offensichtliche, weil du uns gesagt hast, dass es funktioniert: D.

Wenn Sie jedoch planen, nur eine Maske zu einem UITextField hinzuzufügen, ist es unnötig, ein UITextField abzuleiten, vielleicht einfach eine Hilfsmethode oder eine Kategorie zu erstellen, um dem Textfeld eine Maske hinzuzufügen, die sauberer zu sein scheint.

Verwandte Themen