J'ai actuellement une frontière régulière. Je voudrais seulement avoir une bordure supérieure et inférieure.
Comment puis-je accomplir cela?
En utilisant la propriété UITextField
's layer
, j'ai le code suivant:
self.layer.borderColor = [[UIColor colorWithRed:160/255.0f green:160/255.0f blue:160/255.0f alpha:1.0f] CGColor];
self.layer.borderWidth = 4.0f;
Je l'ai en quelque sorte obtenu en rendant mon UITextField très long, afin que l'utilisateur ne voie pas les bordures gauche et droite, mais je me demandais simplement s'il y avait une meilleure façon de le faire, moins agressive.
J'ai vérifié les docs, et la modification d'une UITextField
's borderStyle
n'a pas cette option.
De,
Un premier minuteur iOS
Une approche que j'ai trouvée fonctionne bien est l'utilisation de couches. Voici un extrait:
CALayer *bottomBorder = [CALayer layer];
bottomBorder.frame = CGRectMake(0.0f, self.frame.size.height - 1, self.frame.size.width, 1.0f);
bottomBorder.backgroundColor = [UIColor blackColor].CGColor;
[myTextField.layer addSublayer:bottomBorder];
J'espère que ça aide quelqu'un.
Le grand et simple exemple de @ user3075378 dans Swift
var bottomBorder = CALayer()
bottomBorder.frame = CGRectMake(0.0, textField.frame.size.height - 1, textField.frame.size.width, 1.0);
bottomBorder.backgroundColor = UIColor.blackColor().CGColor
textField.layer.addSublayer(bottomBorder)
@Sebyddd pourquoi s'arrêter là? (;
EDIT: Il y a un problème avec les lignes dessinées avant que la mise en page automatique ne définisse le cadre approprié pour la vue. J'ai modifié ma réponse avec un correctif: cela implique d'appeler drawLines()
dans layoutSubviews()
:
class FramedTextField: UITextField {
@IBInspectable var linesWidth: CGFloat = 1.0 { didSet{ drawLines() } }
@IBInspectable var linesColor: UIColor = UIColor.blackColor() { didSet{ drawLines() } }
@IBInspectable var leftLine: Bool = false { didSet{ drawLines() } }
@IBInspectable var rightLine: Bool = false { didSet{ drawLines() } }
@IBInspectable var bottomLine: Bool = false { didSet{ drawLines() } }
@IBInspectable var topLine: Bool = false { didSet{ drawLines() } }
func drawLines() {
if bottomLine {
add(CGRectMake(0.0, frame.size.height - linesWidth, frame.size.width, linesWidth))
}
if topLine {
add(CGRectMake(0.0, 0.0, frame.size.width, linesWidth))
}
if rightLine {
add(CGRectMake(frame.size.width - linesWidth, 0.0, linesWidth, frame.size.height))
}
if leftLine {
add(CGRectMake(0.0, 0.0, linesWidth, frame.size.height))
}
}
typealias Line = CGRect
private func add(line: Line) {
let border = CALayer()
border.frame = line
border.backgroundColor = linesColor.CGColor
layer.addSublayer(border)
}
override func layoutSubviews() {
super.layoutSubviews()
drawLines()
}
}
vous pouvez créer une image avec une bordure supérieure et inférieure et la définir sur l'arrière-plan de votre UITextField
yourTextField.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"yourBorderedImageName"]];
Vous pouvez également ajouter des vues en haut et en bas à utiliser comme bordures.
// Top border
UIView *topBorder = [[UIView alloc]
initWithFrame:CGRectMake(0,
0,
textfield.frame.size.width,
4.0f)];
topBorder.backgroundColor = [UIColor colorWithRed:160/255.0f
green:160/255.0f
blue:160/255.0f
alpha:1.0f];
[textfield addSubview:topBorder];
// Bottom border
UIView *bottomBorder = [[UIView alloc]
initWithFrame:CGRectMake(0,
textfield.frame.Origin.y +
textfield.frame.size.height - 4.0f,
textfield.frame.size.width,
4.0f)];
bottomBorder.backgroundColor = [UIColor colorWithRed:160/255.0f
green:160/255.0f
blue:160/255.0f
alpha:1.0f];
[textfield addSubview:bottomBorder];
Vous pouvez utiliser des couches pour ajouter des lignes/formes à n’importe quelle sous-classe UIView. Ce code dessine deux lignes en haut et en bas d'un champ de texte. Vous pouvez l'ajouter à une sous-classe d'un contrôle ou l'appeler directement dans une vue/un contrôleur de vue parent.
CGRect layerFrame = CGRectMake(0, 0, _usernameField.frame.size.width, _usernameField.frame.size.height);
CGMutablePathRef path = CGPathCreateMutable();
CGPathMoveToPoint(path, NULL, 0, 0);
CGPathAddLineToPoint(path, NULL, layerFrame.size.width, 0); // top line
CGPathMoveToPoint(path, NULL, 0, layerFrame.size.height);
CGPathAddLineToPoint(path, NULL, layerFrame.size.width, layerFrame.size.height); // bottom line
CAShapeLayer * line = [CAShapeLayer layer];
line.path = path;
line.lineWidth = 2;
line.frame = layerFrame;
line.strokeColor = [UIColor blackColor].CGColor;
[_usernameField.layer addSublayer:line];
Swift 3: Nettoyer avec AutoLayout (J'utilise ici PureLayout mais vous pouvez également le faire avec NSLayoutConstraint:
func makeUnderline(for textField: UITextField) {
let borderLine = UIView()
borderLine.backgroundColor = UIColor.black
borderLine.autoSetDimension(.height, toSize: 1)
textField.addSubview(borderLine)
borderLine.autoPinEdgesToSuperviewEdges(with: UIEdgeInsets.zero, excludingEdge: .top)
}
Je vous suggère de placer une vue à gauche du champ de texte et une vue à droite du champ de texte pour couvrir le bord gauche/droit.
UIView *v1 = [[UIView all] initWithFrame:CGRectMake(textfield.frame.Origin.x - 5, textfield.frame.Origin.y, 10, textifield.frame.size.height)];
UIView *v2 = [[UIView all] initWithFrame:CGRectMake(textfield.frame.Origin.x + textfield.frame.size.with - 5, textfield.frame.Origin.y, 10, textifield.frame.size.height)];
J'espère que cela vous aidera, mettez ceci dans une classe de substitution de champ de texte
UIView *view = [[UIView alloc] init];
view.translatesAutoresizingMaskIntoConstraints = NO;
view.layer.borderWidth = 1;
view.backgroundColor = [UIColor blackColor];
[self addSubview:view];
[self addConstraint:[NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeBottom multiplier:1.0 constant:0.0]];
[self addConstraint:[NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeWidth multiplier:1.0 constant:0.0]];
[self addConstraint:[NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeHeight multiplier:1.0 constant:1.0]];
[self addConstraint:[NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeCenterX multiplier:1.0 constant:1.0]];
Merci à user3075378. ma réponse est basée sur la sienne. ajout de petites lignes à droite et à gauche.
- (void)styleSearchTextField {
CALayer *bottomBorder = [CALayer layer], *leftBorder = [CALayer layer], *rightBorder = [CALayer layer];
CGFloat thickness = 1.0f;
CGFloat side_height = 6.0f;
bottomBorder.frame = CGRectMake(0.0f, searchTextField.frame.size.height - 1, searchTextField.frame.size.width, thickness);
leftBorder.frame = CGRectMake(0.0f, searchTextField.frame.size.height - side_height, thickness, searchTextField.frame.size.height - 1);
rightBorder.frame = CGRectMake(searchTextField.frame.size.width - 1, searchTextField.frame.size.height - side_height, thickness, searchTextField.frame.size.height - 1);
bottomBorder.backgroundColor = [self.stylingDetails themeGrayColor].CGColor;
leftBorder.backgroundColor = [self.stylingDetails themeGrayColor].CGColor;
rightBorder.backgroundColor = [self.stylingDetails themeGrayColor].CGColor;
[searchTextField.layer addSublayer:bottomBorder];
[searchTextField.layer addSublayer:leftBorder];
[searchTextField.layer addSublayer:rightBorder];
}