Change UITextField background when editing begins

后端 未结 4 1507
没有蜡笔的小新
没有蜡笔的小新 2020-12-29 11:12

I\'d like to change the background image of a UITextField when it becomes the firstResponder to show the user that it has focus, similar to the :active or :focus pseudo-clas

相关标签:
4条回答
  • 2020-12-29 11:34

    The cleanest way IMHO is to subclass UITextField and override becomeFirstResponder and resignFirstResponder to change the background image of the text field. That way, you can use your new subclass anywhere without having to reimplement the delegate methods to change the background.

    - (BOOL)becomeFirstResponder {
        BOOL outcome = [super becomeFirstResponder];
        if (outcome) {
          self.background = // selected state image;
        }
        return outcome;
    }
    
    - (BOOL)resignFirstResponder {
        BOOL outcome = [super resignFirstResponder];
        if (outcome) {
          self.background = // normal state image;
        }
        return outcome;
    }
    
    0 讨论(0)
  • 2020-12-29 11:35

    You can probably try observing for changes to isFirstResponder. and changing the background in the notification method. Something like:

    [textField addObserver:theObserver forKeyPath:@"isFirstResponder" options:0 context:nil];
    

    Then in the observer:

    - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
        if(object == textField && [keyPath isEqual:@"isFirstResponder"]) {
            //fiddle with object here
        }
    }
    
    0 讨论(0)
  • 2020-12-29 11:46

    SWIFT 4

    textField.addTarget(self, action: #selector(anyFunction), for: UIControlEvents.editingDidBegin)
    
    
    @objc func anyFunction() {
        // Add your conde here
    }
    
    0 讨论(0)
  • 2020-12-29 11:48

    You might as well use the UITextFieldDelegate methods (IMHO, easier to maintain than key-value observers):

    #pragma mark -
    #pragma mark UITextFieldDelegate methods
    
    - (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
    {
        _field.background = [UIImage imageNamed:@"focus.png"];
        return YES;
    }
    
    - (BOOL)textFieldShouldEndEditing:(UITextField *)textField
    {
        _field.background = [UIImage imageNamed:@"nofocus.png"];
        return YES;
    }
    
    - (BOOL)textFieldShouldReturn:(UITextField *)textField
    {
        [textField resignFirstResponder];
        return YES;
    }
    

    This only works when the UITextField.borderStyle property is of any type but UITextBorderStyleRoundedRect (in that case, the background property is not taken into account). This means you might use the code above with UITextBorderStyleBezel, UITextBorderStyleLine and UITextBorderStyleNone, as explained in the borderStyle documentation:

    borderStyle

    The border style used by the text field.

    @property(nonatomic) UITextBorderStyle borderStyle

    Discussion

    The default value for this property is UITextBorderStyleNone. If a custom background image is set, this property is ignored.

    This is the documentation for the background property of UITextField:

    background

    The image that represents the background appearance of the text field when it is enabled.

    @property(nonatomic, retain) UIImage *background

    Discussion

    When set, the image referred to by this property replaces the standard appearance controlled by the borderStyle property. Background images are drawn in the border rectangle portion of the image. Images you use for the text field’s background should be able to stretch to fit.

    0 讨论(0)
提交回复
热议问题