UITextField with leftViewMode UITextFieldViewModeUnlessEditing 在编辑时保持可见

Ros*_* K. 5 objective-c uitextfield ios

我有一个 UITextField 子类对象和 leftViewleftViewMode设置为UITextFieldViewModeUnlessEditing。然而,左视图在编辑过程中保持可见,直到用户输入至少一个字符。

输入文本之前:

在此输入图像描述

输入文本后:

在此输入图像描述

问题:

  1. 这种行为是否符合预期并有记录?我怎样才能确保

  2. 在输入任何字符之前,编辑期间左视图不可见?

jle*_*ehr 4

回答你的问题:

  1. 是的,这似乎是预期的UITextField行为,尽管我能找到的任何官方文档中都没有明确说明这一点。

  2. 您可以通过实现方法来进一步自定义默认行为UITextFieldDelegate,例如,在编辑开始后立即删除覆盖视图,即使文本字段为空也是如此。

例如,假设您定义了一个属性来保存对自定义覆盖视图的强引用:

@interface ViewController () <UITextFieldDelegate>

@property (strong, nonatomic) IBOutlet UITextField *textField;
@property (strong, nonatomic) UIView *customView;

@end
Run Code Online (Sandbox Code Playgroud)

然后,您可以配置覆盖视图并在 中注册委托通知viewWillAppear:,如下所示:

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    self.customView = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, 30.0, 30.0)];
    self.customView.backgroundColor = [UIColor orangeColor];
    self.textField.leftView = self.customView;
    self.textField.leftViewMode = UITextFieldViewModeUnlessEditing;

    self.textField.delegate = self;
}
Run Code Online (Sandbox Code Playgroud)

要使覆盖视图在用户触摸文本字段后立即消失,请将leftView(或rightView) 属性设置为nil编辑开始时。只需确保在编辑结束时将其设置为再次指向您的自定义视图即可。

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    self.textField.leftView = nil;
}

- (void)textFieldDidEndEditing:(UITextField *)textField
{
    self.textField.leftView = self.customView;
}
Run Code Online (Sandbox Code Playgroud)

编辑

更通用的方法是简单地在编辑开始和结束时切换模式,这将消除维护对覆盖视图的引用的需要。

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    self.textField.leftViewMode = UITextFieldViewModeNever;
}

- (void)textFieldDidEndEditing:(UITextField *)textField
{
    self.textField.leftViewMode = UITextFieldViewModeUnlessEditing;
}
Run Code Online (Sandbox Code Playgroud)