Placeholder in UITextView

前端 未结 30 2817
野趣味
野趣味 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:15

    I made my own version of the subclass of 'UITextView'. I liked Sam Soffes's idea of using the notifications, but I didn't liked the drawRect: overwrite. Seems overkill to me. I think I made a very clean implementation.

    You can look at my subclass here. A demo project is also included.

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

    Simple way to use this within some line of code:

    Take one label up to UITextView in .nib connecting this label to your code , After it.

    - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text{
    
        if (range.location>0 || text.length!=0) {
            placeholderLabel1.hidden = YES;
        }else{
            placeholderLabel1.hidden = NO;
        }
        return YES;
    }
    
    0 讨论(0)
  • 2020-11-22 16:17

    I've modified Sam Soffes' implementation to work with iOS7:

    - (void)drawRect:(CGRect)rect
    {
        [super drawRect:rect];
    
        if (_shouldDrawPlaceholder)
        {
            UIEdgeInsets insets = self.textContainerInset;        
            CGRect placeholderRect = CGRectMake(
                    insets.left + self.textContainer.lineFragmentPadding,
                    insets.top,
                    self.frame.size.width - insets.left - insets.right,
                    self.frame.size.height - insets.top - insets.bottom);
    
            [_placeholderText drawWithRect:placeholderRect
                               options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingTruncatesLastVisibleLine
                            attributes:self.placeholderAttributes
                               context:nil];
        }
    }
    
    - (NSDictionary *)placeholderAttributes
    {
        if (_placeholderAttributes == nil)
        {
            _placeholderAttributes = @
            {
                NSFontAttributeName : self.font,
                NSForegroundColorAttributeName : self.placeholderColor
            };
        }
    
        return _placeholderAttributes;
    }
    

    Remember to set _placeholderAttribues = nil in methods that might change the font and other thigns that might affect them. You might also want to skip "lazy" making of the attributes dictionary if that doesn't bug you.

    EDIT:

    Remember to call setNeedsDisplay in a overridden version of setBounds if you like the placeholder to look good after autolayout animations and the like.

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

    Hi you can use IQTextView available in IQKeyboard Manager it's simple to use and integrate just set class of your textview to IQTextView and you can use its property for setting placeholder label with color you want. You can download the library from IQKeyboardManager

    or you can install it from cocoapods.

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

    I extended KmKndy's answer, so that the placeholder remains visible until the user starts editing the UITextView rather than just taps on it. This mirrors the functionality in the Twitter and Facebook apps. My solution doesn't require you to subclass and works if the user types directly or pastes text!

    Example of Placeholder Twitter App

    - (void)textViewDidChangeSelection:(UITextView *)textView{
        if ([textView.text isEqualToString:@"What's happening?"] && [textView.textColor isEqual:[UIColor lightGrayColor]])[textView setSelectedRange:NSMakeRange(0, 0)];
    
    }
    
    - (void)textViewDidBeginEditing:(UITextView *)textView{
    
        [textView setSelectedRange:NSMakeRange(0, 0)];
    }
    
    - (void)textViewDidChange:(UITextView *)textView
    {
        if (textView.text.length != 0 && [[textView.text substringFromIndex:1] isEqualToString:@"What's happening?"] && [textView.textColor isEqual:[UIColor lightGrayColor]]){
            textView.text = [textView.text substringToIndex:1];
            textView.textColor = [UIColor blackColor]; //optional
    
        }
        else if(textView.text.length == 0){
            textView.text = @"What's happening?";
            textView.textColor = [UIColor lightGrayColor];
            [textView setSelectedRange:NSMakeRange(0, 0)];
        }
    }
    
    - (void)textViewDidEndEditing:(UITextView *)textView
    {
        if ([textView.text isEqualToString:@""]) {
            textView.text = @"What's happening?";
            textView.textColor = [UIColor lightGrayColor]; //optional
        }
        [textView resignFirstResponder];
    }
    
    - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text{
        if (textView.text.length > 1 && [textView.text isEqualToString:@"What's happening?"]) {
             textView.text = @"";
             textView.textColor = [UIColor blackColor];
        }
    
        return YES;
    }
    

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

    UITextView *myUITextView = [[UITextView alloc] init];
    myUITextView.delegate = self;
    myUITextView.text = @"What's happening?";
    myUITextView.textColor = [UIColor lightGrayColor]; //optional
    

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

    @interface MyClass () <UITextViewDelegate>
    @end
    
    0 讨论(0)
  • 2020-11-22 16:20

    What you can do is set up the text view with some initial value in the text property, and change the textColor to [UIColor grayColor] or something similar. Then, whenever the text view becomes editable, clear the text and present a cursor, and if the text field is ever empty again, put your placeholder text back. Change the color to [UIColor blackColor] as appropriate.

    It's not exactly the same as the placeholder functionality in a UITextField, but it's close.

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