444 Stimmen

Texteinschub für UITextField?

Ich würde gerne die Text eines UITextField .

Ist dies möglich?

1 Stimmen

14voto

LondonGuy Punkte 10149

Schnell

    // adjust place holder text
    let paddingView = UIView(frame: CGRectMake(0, 0, 10, usernameOrEmailField.frame.height))
    usernameOrEmailField.leftView = paddingView
    usernameOrEmailField.leftViewMode = UITextFieldViewMode.Always

2 Stimmen

Dies ist eine wirklich billige und einfache Abhilfe. Danke!

1 Stimmen

Erstaunlich, gute Arbeit. Es funktioniert wie ein Glücksbringer. Perfekt für mich.

14voto

Golden Punkte 153

Sie können den Texteinschub für UITextField festlegen, indem Sie die leftView.

Zum Beispiel so:

UITextField *yourTextField = [[UITextField alloc] init];
UIView *leftView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 5, 5)];
leftView.backgroundColor = [UIColor clearColor];
yourTextField.leftViewMode = UITextFieldViewModeAlways;
yourTextField.leftView = leftView;

1 Stimmen

Wenn Sie auch die linke Ansicht für ein Symbol verwenden müssen, kann dies nicht funktionieren

0 Stimmen

@Reaper diese Methode funktioniert auch für ein Bild. Fügen Sie die gewünschte Menge an Padding zur Breite des Bildrahmens hinzu und setzen Sie contentmode auf center. imageView.contentMode = UIViewContentMode.Center imageView.frame = CGRectMake(0.0, 0.0, imageView.image!.size.width + 16.0, imageView.image!.size.height)

0 Stimmen

Das ist viel zu umständlich. Es gibt bereits eine textRectForBounds-Methode zum Einstellen des Einrückens

13voto

Brody Robertson Punkte 8317

Ein guter Ansatz, um UITextField eine Auffüllung hinzuzufügen, ist die Unterklasse UITextField und das Hinzufügen einer Eigenschaft edgeInsets. Sie setzen dann die edgeInsets und das UITextField wird entsprechend gezeichnet. Dies funktioniert auch korrekt mit einem benutzerdefinierten leftView oder rightView Satz.

OSTextField.h

#import <UIKit/UIKit.h>

@interface OSTextField : UITextField

@property (nonatomic, assign) UIEdgeInsets edgeInsets;

@end

OSTextField.m

#import "OSTextField.h"

@implementation OSTextField

- (id)initWithFrame:(CGRect)frame{
    self = [super initWithFrame:frame];
    if (self) {
        self.edgeInsets = UIEdgeInsetsMake(0, 0, 0, 0);
    }
    return self;
}

-(id)initWithCoder:(NSCoder *)aDecoder{
    self = [super initWithCoder:aDecoder];
    if(self){
        self.edgeInsets = UIEdgeInsetsMake(0, 0, 0, 0);
    }
    return self;
}

- (CGRect)textRectForBounds:(CGRect)bounds {
    return [super textRectForBounds:UIEdgeInsetsInsetRect(bounds, self.edgeInsets)];
}

- (CGRect)editingRectForBounds:(CGRect)bounds {
    return [super editingRectForBounds:UIEdgeInsetsInsetRect(bounds, self.edgeInsets)];
}

@end

0 Stimmen

Gute Antwort. Liefert die fehlende Eigenschaft :-)

9voto

Mussa Charles Punkte 3218

Swift 5 Version von Christophs Antwort mit extra Anwendungsbeispiel

import UIKit

private class InsetTextField: UITextField {
    var insets: UIEdgeInsets

    init(insets: UIEdgeInsets) {
        self.insets = insets
        super.init(frame: .zero)
    }

    required init(coder aDecoder: NSCoder) {
        fatalError("not intended for use from a NIB")
    }

    // placeholder position
    override func textRect(forBounds bounds: CGRect) -> CGRect {
         return super.textRect(forBounds: bounds.inset(by: insets))
    }

    // text position
    override func editingRect(forBounds bounds: CGRect) -> CGRect {
         return super.editingRect(forBounds: bounds.inset(by: insets))
    }
}

extension UITextField {

    class func textFieldWithInsets(insets: UIEdgeInsets) -> UITextField {
        return InsetTextField(insets: insets)
    }

}

Verwendung: -

class ViewController: UIViewController {

  private let passwordTextField: UITextField = {

        let textField = UITextField.textFieldWithInsets(insets: UIEdgeInsets(top: 10, left: 15, bottom: 10, right: 15))
     // ---

        return textField
    }()

}

0 Stimmen

Abgesehen davon, dass `get{}` für nur über Getter berechnete Eigenschaften nicht erforderlich ist, benötigen Sie in Swift 5 keine Return-Anweisung für 1-Zeiler, so dass Sie den Anwendungsfall ein wenig straffen können: let passwordTextField = { UITextField.textFieldWithInsets(insets: UIEdgeInsets(top:0, left:5, bottom:0, right:15)) }()

0 Stimmen

Das funktioniert übrigens hervorragend, und es ist ein interessanter Ansatz. Gemischte Gefühle über die Verschleierung durch das Hinzufügen der Erweiterung aber. Nicht sicher, warum nicht einfach lassen Sie die Klasse öffentlich sein und machen Sie es klar, dass Sie eine Unterklasse von UITextField instanziieren, wo Sie es verwenden.

7voto

Bruno Paulino Punkte 5314

Swift 4.2 Version:

import UIKit

class InsetTextField: UITextField {

  let inset: CGFloat = 10

  override func textRect(forBounds bounds: CGRect) -> CGRect {
    return bounds.insetBy(dx: inset, dy: inset)
  }

  override func editingRect(forBounds bounds: CGRect) -> CGRect {
    return bounds.insetBy(dx: inset, dy: inset)
  }

  override func placeholderRect(forBounds bounds: CGRect) -> CGRect {
    return bounds.insetBy(dx: inset, dy: inset)
  }

}

0 Stimmen

Seltsamerweise wirkt sich dies auf die Bildlaufleistung aus (zumindest unter iOS 12), wenn der Text das sichtbare Rechteck übersteigt. Mit einem Einschub von 15 hält es sogar scrollen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X