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的placeholderUITextView上如何加上类似于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的键盘隐藏。
具体的实现方式很多, 可以通过通知,手势, 代理方法等等,来实现.