Placeholder in UITextView

前端 未结 30 2827
野趣味
野趣味 2020-11-22 16:01

My application uses an UITextView. Now I want the UITextView to have a placeholder similar to the one you can set for an UITextField.<

相关标签:
30条回答
  • 2020-11-22 16:07

    Easy way, just create placeholder text in UITextView by using the following UITextViewDelegate methods:

    - (void)textViewDidBeginEditing:(UITextView *)textView
    {
        if ([textView.text isEqualToString:@"placeholder text here..."]) {
             textView.text = @"";
             textView.textColor = [UIColor blackColor]; //optional
        }
        [textView becomeFirstResponder];
    }
    
    - (void)textViewDidEndEditing:(UITextView *)textView
    {
        if ([textView.text isEqualToString:@""]) {
            textView.text = @"placeholder text here...";
            textView.textColor = [UIColor lightGrayColor]; //optional
        }
        [textView resignFirstResponder];
    }
    

    just remember to set myUITextView with the exact text on creation e.g.

    UITextView *myUITextView = [[UITextView alloc] init];
    myUITextView.delegate = self;
    myUITextView.text = @"placeholder text here...";
    myUITextView.textColor = [UIColor lightGrayColor]; //optional
    

    and make the parent class a UITextViewDelegate before including these methods e.g.

    @interface MyClass () <UITextViewDelegate>
    @end
    

    Code for Swift 3.1

    func textViewDidBeginEditing(_ textView: UITextView) 
    {
        if (textView.text == "placeholder text here..." && textView.textColor == .lightGray)
        {
            textView.text = ""
            textView.textColor = .black
        }
        textView.becomeFirstResponder() //Optional
    }
    
    func textViewDidEndEditing(_ textView: UITextView)
    {
        if (textView.text == "")
        {
            textView.text = "placeholder text here..."
            textView.textColor = .lightGray
        }
        textView.resignFirstResponder()
    }
    

    just remember to set myUITextView with the exact text on creation e.g.

     let myUITextView = UITextView.init()
     myUITextView.delegate = self
     myUITextView.text = "placeholder text here..."
     myUITextView.textColor = .lightGray
    

    and make the parent class a UITextViewDelegate before including these methods e.g.

    class MyClass: UITextViewDelegate
    {
    
    }
    
    0 讨论(0)
  • 2020-11-22 16:07

    I found myself a very easy way to imitate a place-holder

    1. in the NIB or code set your textView's textColor to lightGrayColor (most of the time)
    2. make sure that your textView's delegate is linked to file's owner and implement UITextViewDelegate in your header file
    3. set the default text of your text view to (example: "Foobar placeholder")
    4. implement: (BOOL) textViewShouldBeginEditing:(UITextView *)textView

    Edit:

    Changed if statements to compare tags rather than text. If the user deleted their text it was possible to also accidentally delete a portion of the place holder @"Foobar placeholder".This meant if the user re-entered the textView the following delegate method, -(BOOL) textViewShouldBeginEditing:(UITextView *) textView, it would not work as expected. I tried comparing by the color of the text in the if statement but found that light grey color set in interface builder is not the same as light grey color set in code with [UIColor lightGreyColor]

    - (BOOL) textViewShouldBeginEditing:(UITextView *)textView
    {
        if(textView.tag == 0) {
            textView.text = @"";
            textView.textColor = [UIColor blackColor];
            textView.tag = 1;
        }
        return YES;
    }
    

    It is also possible to reset the placeholder text when the keyboard returns and the [textView length] == 0

    EDIT:

    Just to make the last part clearer - here's is how you can set the placeholder text back:

    - (void)textViewDidChange:(UITextView *)textView
    {
       if([textView.text length] == 0)
       {
           textView.text = @"Foobar placeholder";
           textView.textColor = [UIColor lightGrayColor];
           textView.tag = 0;
       }
    }
    
    0 讨论(0)
  • 2020-11-22 16:07

    Lets make it easy

    Create one UILabel and place it on your text view(Give the text as Placeholder-set color gray-you can do all this in your xib) Now in you header file declare the UILabel and also the the textviewDelegate Now you can simply hide the label when you click on the textview

    complete code below

    header

    @interface ViewController :UIViewController<UITextViewDelegate>{
     }
       @property (nonatomic,strong) IBOutlet UILabel *PlceHolder_label;
       @property (nonatomic,strong) IBOutlet UITextView *TextView;
    
    @end
    

    implementation

    @implementation UploadFoodImageViewController
    @synthesize PlceHolder_label,TextView;
    
      - (void)viewDidLoad
        {
           [super viewDidLoad];
        }
    
    
     - (BOOL)textViewShouldBeginEditing:(UITextView *)textView{
    
           if([textView isEqual:TextView]){
                [PlceHolder_label setHidden:YES];
                [self.tabScrlVw setContentOffset:CGPointMake(0,150) animated:YES];
              }
          return YES;
        }
    

    @end

    Dont forget to connect the textView and UILabel to filesowner from xib

    0 讨论(0)
  • 2020-11-22 16:08

    You can set the label on the UITextView by

    [UITextView addSubView:lblPlaceHoldaer];
    

    and hide it on TextViewdidChange method.

    This is the simple & easy way.

    0 讨论(0)
  • 2020-11-22 16:08

    Simple Swift 3 solution

    Add UITextViewDelegate to your class

    Set yourTextView.delegate = self

    Create placeholderLabel and position it inside yourTextView

    Now just animate placeholderLabel.alpha on textViewDidChange:

      func textViewDidChange(_ textView: UITextView) {
        let newAlpha: CGFloat = textView.text.isEmpty ? 1 : 0
        if placeholderLabel.alpha != newAlpha {
          UIView.animate(withDuration: 0.3) {
            self.placeholderLabel.alpha = newAlpha
          }
        }
      }
    

    you might have to play with placeholderLabel position to set it up right, but that shouldn't be too hard

    0 讨论(0)
  • 2020-11-22 16:09

    I recommend to use SZTextView.

    https://github.com/glaszig/SZTextView

    Add your default UITextView from storyboard and then change its custom class to SZTextView like below

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