UI之UITextView相关总结(二)

六.UITextView 计算行数
PS:有时我们需要对textView的行高进行判断,从而做一些操作.
CGSize size = [textView.text sizeWithAttributes:@{your font} constrainedToSize:textViewSize];
UIFont *font = your font; //NSFontAttributeName:[UIFontsystemFontOfSize:17]
NSInteger lines = (NSInteger)(size.height / font.lineHeight);
七.获取UITextView的自定义高度
方法一:ios7.0之前适用
- (float) heightForString:(NSString *)value fontSize:(float)fontSize andWidth:(float)width
{
    CGSize sizeToFit = [value sizeWithFont:[UIFont systemFontOfSize:fontSize]
                         constrainedToSize:CGSizeMake(width -16.0, CGFLOAT_MAX)
                             lineBreakMode:NSLineBreakByWordWrapping];
        //此处的换行类型(lineBreakMode)可根据自己的实际情况进行设置
    returnsizeToFit.height + 16.0;
}
参数的含义:
 @method 获取指定宽度width,字体大小fontSize,字符串value的高度
 @param value 待计算的字符串
 @param fontSize 字体的大小
 @param Width 限制字符串显示区域的宽度
 @result float 返回的高度
方法二:ios7.0及之后适用
- (float) heightForString:(NSString *)value andWidth:(float)width{
    //获取当前文本的属性
    NSAttributedString *attrStr = [[NSAttributedString alloc] initWithString:value];
    _text.attributedText = attrStr;
    NSRange range = NSMakeRange(0, attrStr.length);
    // 获取该段attributedString的属性字典
    NSDictionary *dic = [attrStr attributesAtIndex:0effectiveRange:&range];
    // 计算文本的大小
    CGSize sizeToFit = [value boundingRectWithSize:CGSizeMake(width - 16.0, MAXFLOAT) // 用于计算文本绘制时占据的矩形块
                                           options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading // 文本绘制时的附加选项
                                        attributes:dic // 文字的属性
                                           context:nil].size;// context上下文。包括一些信息,例如如何调整字间距以及缩放。该对象包含的信息将用于文本绘制。该参数可为nil
    returnsizeToFit.height + 16.0;
}
参数的含义:
 @method 获取指定宽度width,字体大小fontSize,字符串value的高度
 @param value 待计算的字符串
 @param fontSize 字体的大小
 @param Width 限制字符串显示区域的宽度
 @result float 返回的高度
//注意:
第一,再前两种方法中,UITextView在上下左右分别有一个8px的padding,需要将UITextView.contentSize.width减去16像素(左右的padding 2 x 8px)。同时返回的高度中再加上16像素(上下的padding),这样得到的才是UITextView真正适应内容的高度。如代码中 CGSizeMake(width -16.0, CGFLOAT_MAX),return sizeToFit.height + 16.0。UILable中则不用
第二,options 参数请使用:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading设置两个枚举,不要设置一个
方法三:通用(推荐)
- (float) heightForString:(UITextView *)textView andWidth:(float)width{
     CGSize sizeToFit = [textView sizeThatFits:CGSizeMake(width, MAXFLOAT)];
    returnsizeToFit.height;
}
参数的含义:
 @method 获取指定宽度width的字符串在UITextView上的高度
 @param textView 待计算的UITextView
 @param Width 限制字符串显示区域的宽度
 @result float 返回的高度
八,设置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和UITextfied的自定义键盘

    相对于UITextView和UITextfied,我们常常可能需要用inputView 和 inputAccessoryView属性对键盘进行相关的自定义.我们先看一下UIResponder中的inputView 和 inputAccessoryView属性:

   @property (nullable, nonatomic, readonly, strong)   UIView *inputView 
   @property (nullable, nonatomic, readonly, strong)   UIView *inputAccessoryView 

我看到inputView 和 inputAccessoryView属性在UIResponder中是存在并且是readonly, 所以根据子类继承父类的关系,我们可以知道,凡是继承于UIResponder的子类,都应该拥有inputView 和 inputAccessoryView属性,且readonly. 不仅仅是UITextView和UITextfied所独有. 但是我们在UITextview和UITextfiled中

   @property (nullable, readwrite, strong) UIView *inputView;             
   @property (nullable, readwrite, strong) UIView *inputAccessoryView;

两者属性确实readwrite.

那么问题来了,我们想要在非UITextfiled,UITextView 中实现inputView 和 inputAccessoryView属性的作用, 我们应该怎么做呢?

以UIButton为例:

既然,在除UITextfiled,UITextView之外,inputView 和 inputAccessoryView属性作用是仅读的(readonly),所以我们需要在UIButton的子类中重写定义这两个属性:

.h

#import <UIKit/UIKit.h>
@interface LXButton : UIButton
@property(nonatomic,readwrite) UIView     * inputView;
@property(nonatomic,readwrite) UIToolbar  * inputAccessoryView;
@end

然后,我们需要添加能够成为第一响应的方法

-(BOOL)canBecomeFirstResponder{
    return YES;
}

我们要在UIButton对象的触发中,让其自身,成为第一响应者.

-(void)buttonAction:(UIButton *)sender{
        [ becomeFirstResponder];
}

效果:


总结:

这个知识点,虽然小,但是可以拓展出很多东西. 就以UIButton为例, 我们可以让UIButton铺满整个屏幕,但是前期是隐藏的. 然后让button在成为第一响应者的时候,显示出来. 这样我们就可以很方便做出弹出视图的效果. 

十一,隐藏键盘的几种方式

隐藏键盘的核心,方法就两个

首先说明两种可以让键盘隐藏的Method:
      1、[view endEditing:YES]  这个方法可以让整个view取消第一响应者,从而让所有控件的键盘隐藏。
      2、[textFiled resignFirstResponder] 这个则是比较常用的让某个textFiled的键盘隐藏。

具体的实现方式很多, 可以通过通知,手势, 代理方法等等,来实现.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值