iOS开发之UITextView,设置textView的行间距及placeholder

来源:互联网 发布:连环替代法不拿出算法 编辑:程序博客网 时间:2024/05/29 12:21


一、设置textView的行间距

1.如果只是静态显示textView的内容为设置的行间距,执行如下代码:

//    textview 改变字体的行间距 
    NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init]; 
    paragraphStyle.lineSpacing = 10;// 字体的行间距 
     
    NSDictionary *attributes = @{ 
                                 NSFontAttributeName:[UIFont systemFontOfSize:15], 
                                 NSParagraphStyleAttributeName:paragraphStyle 
                                 }; 
    textView.attributedText = [[NSAttributedString alloc] initWithString:@"输入你的内容" attributes:attributes];

 

2.如果是想在输入内容的时候就按照设置的行间距进行动态改变,那就需要将上面代码放到textView的delegate方法里

-(void)textViewDidChange:(UITextView *)textView

{

    //    textview 改变字体的行间距

    NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];

    paragraphStyle.lineSpacing = 20;// 字体的行间距

    

    NSDictionary *attributes = @{

                                 NSFontAttributeName:[UIFont systemFontOfSize:15],

                                 NSParagraphStyleAttributeName:paragraphStyle

                                 };

    textView.attributedText = [[NSAttributedString alloc] initWithString:textView.text attributes:attributes];

 

}

 

一、设置textView的placeholder

    UITextView上如何加上类似于UITextField的placeholder呢,其实在UITextView上加上一个UILabel或者UITextView,如果用UILable的话,会出现一个问题就是当placeholder的文字过长导致换行的时候就会出现问题,而用UITextView则可以有效避免此问题。

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text

{    if (![text isEqualToString:@""])

        {

            _placeholderLabel.hidden = YES;

        }

     if ([text isEqualToString:@""] && range.location == 0 && range.length == 1)

        {

            _placeholderLabel.hidden = NO;

        }

    return YES;

}

 

说明如下:

  (1) _placeholderLabel 是加在UITextView后面的UITextView,_placeholderLabel要保证和真正的输入框的设置一样,字体设置成浅灰色,然后[_placeholderLabel setEditable:NO];真正的输入框要设置背景色透明,保证能看到底部的_placeholderLabel。

    (2) [text isEqualToString:@""] 表示输入的是退格键

    (3) range.location == 0 && range.length == 1 表示输入的是第一个字符


让UITextView和UITextField同样拥有垂直居中的属性,建议单独一个类继承自UITextView

只需要初始化UITextView之后用KVO监听 "contentSize" 属性即可

_textView = [[UITextView alloc] initWithFrame:CGRectMake(20.0f, DOT_COORDINATE, 260.0f,TABLE_VIEW_ROW_HEIGHT*2)];

        _textView.delegate = self;

        _textView.text = PROMPT_TEXT;

        _textView.font = [UIFont systemFontOfSize:18.0f];

        _textView.textColor = [UIColor lightGrayColor];

        [self.contentView addSubview:_textView];

        [_textView addObserver:self forKeyPath:@"contentSize" options:(NSKeyValueObservingOptionNew)context:NULL];


#pragma mark - KVO

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void*)context

{

    UITextView *tv = object;

    // Center vertical alignment

    CGFloat topCorrect = ([tv bounds].size.height - [tv contentSize].height * [tv zoomScale])/2.0;

    topCorrect = ( topCorrect < 0.0 ? 0.0 : topCorrect );

    tv.contentOffset = (CGPoint){.x = 0, .y = -topCorrect};


//    // Bottom vertical alignment

//    CGFloat topCorrect = ([tv bounds].size.height - [tv contentSize].height);

//    topCorrect = (topCorrect <0.0 ? 0.0 : topCorrect);

//    tv.contentOffset = (CGPoint){.x = 0, .y = -topCorrect};

 

}


0 0