基本控件的基础使用
只有继承UIControl即控件才能有addtarget action方法(ta方法)
1.UILabel(继承:UIView)
[1].基本属性
1.text:设置标签显示文本。
2.attributedText:设置标签属性文本。
NSString *text = @"first";
NSMutableAttributedString *textLabelStr = [[NSMutableAttributedString alloc] initWithString:text];
[textLabelStr setAttributes:@{NSForegroundColorAttributeName : [UIColor lightGrayColor], NSFontAttributeName : [UIFont systemFontOfSize:17]} range:NSMakeRange(11, 10)];
label.attributedText = textLabelStr;
3.font:设置标签文本字体。
默认是系统自带字体,大小为17。
label.font = [UIFontsystemFontOfSize:17]
label.font = [UIFont fontWithName:@"Arial" size:16];
4.textAlignment:设置标签文本对齐方式。
label.textAlignment = NSTextAlignmentCenter;
5.lineBreakMode:设置标签文字过长时的显示方式,这个属性使用于label中文本的换行和截短。首先numberofLines必须设置为0,才有效果。
label.lineBreakMode = NSLineBreakByCharWrapping;以字符为显示单位显示,后面部分省略不显示。
label.lineBreakMode = NSLineBreakByClipping;剪切与文本宽度相同的内容长度,后半部分被删除。
label.lineBreakMode = NSLineBreakByTruncatingHead;前面部分文字以……方式省略,显示尾部文字内容。
label.lineBreakMode = NSLineBreakByTruncatingMiddle;中间的内容以……方式省略,显示头尾的文字内容。
label.lineBreakMode = NSLineBreakByTruncatingTail;结尾部分的内容以……方式省略,显示头的文字内容。
label.lineBreakMode = NSLineBreakByWordWrapping;以单词为显示单位显示,后面部分省略不显示。
6.enabled:设置文字内容是否可变。
7.adjustsFontSizeToFitWidth:文字内容自适应标签宽度。
8.adjustsLetterSpacingToFitWidth:根据字母的间隔自适应标签宽度,超出部分以……显示。
9.numberOfLines:标签最多显示行数。
10.minimumScaleFactor:设置最小字体,与minimumFontSize相同,minimumFontSize在IOS 6后不能使用。
11.highlightedTextColor:设置文本高亮显示颜色,与highlighted一起使用。
12.shadowColor:设置文本阴影颜色。
13.shadowOffset:设置文本阴影与原文本的偏移量。
label.shadowOffset= CGSizeMake(1.0, 5.0);
14.userInteractionEnabled:设置标签是否忽略或移除用户交互。默认为NO。
15.preferredMaxLayoutWidth:优先选择标签布局的最大宽度。
16.baselineAdjustment:如果adjustsFontSizeToFitWidth属性设置为YES,这个属性就来控制文本基线的行为。
label4.baselineAdjustment = UIBaselineAdjustmentNone;
UIBaselineAdjustmentAlignBaselines=0,默认,文本最上端与中线对齐。
UIBaselineAdjustmentAlignCenters, 文本中线与label中线对齐。
UIBaselineAdjustmentNone, 文本最低端与label中线对齐。
- backgroundColor背景颜色
清空背景颜色label1.backgroundColor= [UIColor clearColor];
[2].根据文本内容自适应大小(忽略字距/行距)
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(20, 20, 300, 400)];
label.textColor = [UIColor yellowColor];
label.backgroundColor = [UIColor greenColor];
label.text = @"欢迎大家\n请坐,dcugdjdbvbdjjhdhckdnvnkdbnuduhsuhuhihshjhosdhvvdhsih 欢迎大家\n请坐,dcugdjdbvbdjjhdhckdnvnkdbnuduhsuhuhihshjhosdhvvdhsih欢迎大家\n请坐,dcugdjdbvbdjjhdhckdnvnkdbnuduhsuhuhihshjhosdhvvdhsih欢迎大家\n请坐,dcugdjdbvbdjjhdhckdnvnkdbnuduhsuhuhihshjhosdhvvdhsih欢迎大家\n请坐,dcugdjdbvbdjjhdhckdnvnkdbnuduhsuhuhihshjhosdhvvdhsih欢迎大家\n请坐,dcugdjdbvbdjjhdhckdnvnkdbnuduhsuhuhihshjhosdhvvdhsih欢迎大家\n请坐,dcugdjdbvbdjjhdhckdnvnkdbnuduhsuhuhihshjhosdhvvdhsih欢迎大家\n请坐,dcugdjdbvbdjjhdhckdnvnkdbnuduhsuhuhihshjhosdhvvdhsih";
float h = [label height];
[self.view addSubview:label];
NSLog(@"height=%f",h);
//在类别里写一个方法
@implementation UILabel (UILabelAutoHeight)
- (float)height{
self.numberOfLines = 0;
self.lineBreakMode = UILineBreakModeWordWrap;
CGRect txtFrame = self.frame;
NSString *str = self.text;
NSDictionary *dic = @{NSFontAttributeName:self.font};
float hh = [str boundingRectWithSize:CGSizeMake(txtFrame.size.width, 3000) options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading attributes:dic context:nil].size.height;
self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, self.frame.size.width, hh);
return hh;
}
[3].NSMutableAttributedString使用详解
1.NSParagraphStyleAttributeName 段落排版
NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init];
style.firstLineHeadIndent = 20;
style.lineSpacing = 20;//行距
style.alignment = NSTextAlignmentCenter;
style.paragraphSpacing = 20;//段距
[attributedString addAttribute:NSParagraphStyleAttributeName value:style range:NSMakeRange(0,string.length)];
2.NSFontAttributeName 字体属性
3.NSForegroundColorAttributeNam 字体颜色
该属性所对应的值是一个 UIColor 对象。该属性用于指定一段文本的字体颜色。如果不指定该属性,则默认为黑色。
NSForegroundColorAttributeName 设置的颜色与 UILabel 的 textColor 属性设置的颜色在地位上是相等的,与 NSBackgroundColorAttributeName 地位上也相等,谁最后赋值,最终显示的就是谁的颜色,但是textColor属性可以与 NSBackgroundColorAttributeName 属性可叠加。
4.NSBackgroundColorAttributeName 字体所在区域背景颜色
该属性所对应的值是一个 UIColor 对象。该属性用于指定一段文本的背景颜色。如果不指定该属性, 默认值为nil, 透明色
5.NSLigatureAttributeName 连笔属性
该属性所对应的值是一个 NSNumber 对象(整数)。连体字符是指某些连在一起的字符,它们采用单个的图元符号。0 表示没有连体字符。1 表示使用默认的连体字符。2表示使用所有连体符号。默认值为 1(注意,iOS 不支持值为 2)。一般中文用不到,在英文中可能出现相邻字母连笔的情况
6.NSKernAttributeName 字符间距
取值为 NSNumber 对象(整数),正值间距加宽,负值间距变窄,值为浮点数,字距属性,默认值为0
7.NSStrikethroughStyleAttributeName 删除线
设置删除线,取值为 NSNumber 对象(整数),枚举默认值是NSUnderlineStyleNone。
NSUnderlineStyleNone 不设置删除线
NSUnderlineStyleSingle 设置删除线为细单实线
NSUnderlineStyleThick 设置删除线为粗单实线
NSUnderlineStyleDouble 设置删除线为细双实线
8.NSStrikethroughColorAttributeName 删除线颜色
取值为 UIColor 对象,默认值为黑色
9.NSUnderlineStyleAttributeName 下划线
取值为 NSNumber 对象(整数),枚举常量 NSUnderlineStyle中的值,与删除线类似,该值指定是否在文字上加上下划线,下划线除了线条位置和删除线不同外,其他的都可以完全参照删除线设置
10.NSUnderlineColorAttributeName 下划线颜色
设置下划线颜色,取值为 UIColor 对象,默认值为黑色
11.NSStrokeWidthAttributeName 笔画宽度
值为浮点数NSNumber,该值改变笔画宽度(相对于字体 size 的百分比)设置笔画的粗细,负值填充效果,正值中空效果,正数只改变描边宽度,负数同时改变文字的描边和填充宽度,默认为 0,即不改变。
12.NSStrokeColorAttributeName 填充部分颜色
填充部分颜色,不是字体颜色,取值为 UIColor 对象
13.NSShadowAttributeName 阴影属性
取值为 NSShadow 对象,默认为 nil。
NSShadow *shadow=[[NSShadow alloc] init];
shadow.shadowBlurRadius=5;//模糊度
shadow.shadowColor=[UIColor yellowColor];
shadow.shadowOffset=CGSizeMake(1, 3);
14.NSObliquenessAttributeName 字形倾斜度
取值为 NSNumber (float),正值右倾,负值左倾,默认值为0,表示没有倾斜
15.NSExpansionAttributeName 横向拉伸属性
取值为 NSNumber (float),正值横向拉伸文本,负值横向压缩文本
16.NSVerticalGlyphFormAttributeName 文字排版方向
取值为 NSNumber 对象(整数),0 表示横排文本,1 表示竖排文本,在iOS中, 总是以横向排版,0 以外的值都未定义
17.NSTextEffectAttributeName 文本特殊效果
这个属性的值是一个NSString对象。使用此属性指定的文字效果,如NSTextEffectLetterpressStyle。此属性的默认值为nil,表示没有文本效应
18.NSBaselineOffsetAttributeName 基线偏移值
取值为 NSNumber (float),表示的字符从基线偏移的NSNumber对象,默认值是0,正值上偏,负值下偏
19.NSWritingDirectionAttributeName 文字书写方向
取值为包含NSNumber对象的数组. 从左向右书写或者从右向左书写
[attributedString addAttribute:NSWritingDirectionAttributeName value:@[@3] range:NSMakeRange(40, 4)];
20.NSLinkAttributeName 链接属性
点击后调用浏览器打开指定URL地址,此属性的值是NSURL对象(首选)或一个NSString对象,此属性的默认值为nil,表示没有链接,UILabel无法使用该属性, 可以使用UITextView 控件
21.NSAttachmentAttributeName 文本附件
取值为NSTextAttachment对象,常用于文字图片混排,此属性的默认值为nil,表示无附件
使用:
//创建NSTextAttachment的对象,用来装载图片
NSTextAttachment *attch = [[NSTextAttachment alloc] init];
//将NSTextAttachment对象的image属性设置为想要使用的图片
attch.image = [UIImage imageNamed:@"lock_wallpaper.jpeg"];
//设置NSTextAttachment对象bounds大小,也就是要显示的图片的大小
attch.bounds = CGRectMake(0, 0, 50, 50);
// 创建带有图片的富文本
NSAttributedString *string = [NSAttributedString attributedStringWithAttachment:attch];
//插入文本指定位置
[attributedString insertAttributedString:string atIndex:7];
//插入文本末尾
[attributedString appendAttributedString:string];
以上部分资料特别感谢https://www.jianshu.com/p/8c7dd7d8501b
2.UIButton的使用(继承:UIControl)
//设置自定义的按钮
UIButton *button1=[UIButton buttonWithType:UIButtonTypeCustom];
UIButton *button1 = [[UIButton alloc] initWithFrame:CGRectMake(150, 150,100, 100)];
//设置一个圆角的按钮
UIButton *button1=[UIButton buttonWithType:UIButtonTypeRoundedRect];
// 能够定义的button类型有以下6种,
// typedef enum {
// UIButtonTypeCustom = 0, 自定义风格
// UIButtonTypeRoundedRect, 圆角矩形
// UIButtonTypeDetailDisclosure, 蓝色小箭头按钮,主要做详细说明用
// UIButtonTypeInfoLight, 亮色感叹号
// UIButtonTypeInfoDark, 暗色感叹号
// UIButtonTypeContactAdd, 十字加号按钮
// } UIButtonType;
//按钮的位置坐标
button1.frame=CGRectMake(80,250,250, 30);
//普通状态按钮标题
[button1 setTitle:@"Button1" forState:UIControlStateNormal];
//高亮状态的按钮标题
[button1 setTitle:@"高亮状态" forState:UIControlStateHighlighted];//
//高亮状态光晕效果
[button1 setShowsTouchWhenHighlighted:YES];
//设置标题的颜色
[button1 setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
//设置标题的字体大小
[button1.titleLabel setFont:[UIFont boldSystemFontOfSize:20]];
button1.titleLabel.font = [UIFont systemFontOfSize:16];
//设置背景颜色
[button1 setBackgroundColor:[UIColor blueColor]];
//图片被拉伸式地设置背景图片
[button1 setBackgroundImage:[UIImage imageNamed:@"1.jpg"] forState:UIControlStateNormal];
//图片保持原来大小地设置背景图片
[button1 setImage:[UIImage imageNamed:@"1.jpg"] forState:UIControlStateNormal];
[[button1 titleLabel]setShadowColor:[UIColor blackColor]];
[[button1 titleLabel]setShadowOffset:CGSizeMake(-0.5, -0.5)];
button1.contentHorizontalAlignment=UIControlContentHorizontalAlignmentLeft;
[self.view addSubview:button1];
//监听事件
[button1 addTarget:self action:@selector(Click_Button) forControlEvents:UIControlEventTouchUpInside];
}
-(void)Click_Button
{
NSLog(@"已点击...");
}
/*
* 默认情况下,当按钮高亮的情况下,图像的颜色会被画深一点,如果这下面的这个属性设置为no,
* 那么可以去掉这个功能
*/
button1.adjustsImageWhenHighlighted = NO;
/*跟上面的情况一样,默认情况下,当按钮禁用的时候,图像会被画得深一点,设置NO可以取消设置*/
button1.adjustsImageWhenDisabled = NO;
/* 下面的这个属性设置为yes的状态下,按钮按下会发光*/
button1.showsTouchWhenHighlighted = YES;
UIButton事件
UIControlEventTouchDown
单点触摸按下事件:用户点触屏幕,或者又有新手指落下的时候。
UIControlEventTouchDownRepeat
多点触摸按下事件,点触计数大于1:用户按下第二、三、或第四根手指的时候。
UIControlEventTouchDragInside
当一次触摸在控件窗口内拖动时。
UIControlEventTouchDragOutside
当一次触摸在控件窗口之外拖动时。
UIControlEventTouchDragEnter
当一次触摸从控件窗口之外拖动到内部时。
UIControlEventTouchDragExit
当一次触摸从控件窗口内部拖动到外部时。
UIControlEventTouchUpInside
所有在控件之内触摸抬起事件。
UIControlEventTouchUpOutside
所有在控件之外触摸抬起事件(点触必须开始与控件内部才会发送通知)。
UIControlEventTouchCancel
所有触摸取消事件,即一次触摸因为放上了太多手指而被取消,或者被上锁或者电话呼叫打断。
UIControlEventTouchChanged
当控件的值发生改变时,发送通知。用于滑块、分段控件、以及其他取值的控件。你可以配置滑块控件何时发送通知,在滑块被放下时发送,或者在被拖动时发送。
UIControlEventEditingDidBegin
当文本控件中开始编辑时发送通知。
UIControlEventEditingChanged
当文本控件中的文本被改变时发送通知。
UIControlEventEditingDidEnd
当文本控件中编辑结束时发送通知。
UIControlEventEditingDidOnExit
当文本控件内通过按下回车键(或等价行为)结束编辑时,发送通知。
UIControlEventAlltouchEvents
通知所有触摸事件。
UIControlEventAllEditingEvents
通知所有关于文本编辑的事件。
UIControlEventAllEvents
通知所有事件。
3.UITextfield的使用(继承:UIControl)
UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(20,240,200,30)];
textField.autocapitalizationType = UITextAutocapitalizationTypeNone;
textField.keyboardType = UIKeyboardTypeNamePhonePad;
textField.borderStyle = UITextBorderStyleRoundedRect;
textField.delegate = self;
textField.returnKeyType = UIReturnKeyDone;
textField.secureTextEntry = NO;
textField.clearButtonMode = UITextFieldViewModeAlways;
textField.textColor = [UIColor redColor];
textField.font = [UIFont boldSystemFontOfSize:14];
[self.view addSubview:textField];
//隐藏键盘方法
- (BOOL)textFieldShouldReturn:(UITextField *)textField{
[textField resignFirstResponder];
return YES;
}
(1) 初始化textfield并设置位置及大小
UITextField *text = [[UITextField alloc]initWithFrame:CGRectMake(20, 20, 130, 30)];
(2) 设置边框样式,只有设置了才会显示边框样式
text.borderStyle = UITextBorderStyleRoundedRect;
typedef enum {
UITextBorderStyleNone,
UITextBorderStyleLine,
UITextBorderStyleBezel,
UITextBorderStyleRoundedRect
} UITextBorderStyle;
(3) 设置输入框的背景颜色,此时设置为白色 如果使用了自定义的背景图片边框会被忽略掉
text.backgroundColor = [UIColor whiteColor];
(4) 设置背景
注意: 只有在 UITextBorderStyleNone 样式下,设置背景图才会生效,且图片大小小于 text 的frame时,图片会拉伸
text.background = [UIImage imageNamed:@"dd.png"];
(5) 设置背景
设置enable为NO 时的背景图片
text.disabledBackground = [UIImage imageNamed:@"cc.png"];
(6)当输入框没有内容时,水印提示 提示内容为password
text.placeholder = @"password";
(7) 设置输入框内容的字体样式和大小
text.font = [UIFont fontWithName:@"Arial" size:20.0f];
(8) 设置字体颜色
text.textColor = [UIColor redColor];
(9)输入框中是否有个叉号,在什么时候显示,用于一次性删除输入框中的内容
text.clearButtonMode = UITextFieldViewModeAlways;
typedef enum {
UITextFieldViewModeNever, 从不出现
UITextFieldViewModeWhileEditing, 编辑时出现
UITextFieldViewModeUnlessEditing, 除了编辑外都出现
UITextFieldViewModeAlways 一直出现
} UITextFieldViewMode;
(10)输入框中一开始就有的文字
text.text = @"一开始就在输入框的文字";
(11) 每输入一个字符就变成点 用密码输入
text.secureTextEntry = YES;
(12) 是否纠错
typedef enum {
UITextAutocorrectionTypeDefault, 默认
UITextAutocorrectionTypeNo, 不自动纠错
UITextAutocorrectionTypeYes, 自动纠错
} UITextAutocorrectionType;
(14)再次编辑就清空
text.clearsOnBeginEditing = YES;
(15) 内容对齐方式
text.textAlignment = UITextAlignmentLeft;
(16) 内容的垂直对齐方式
text.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
(17) 设置为YES时文本会自动缩小以适应文本窗口大小.默认是保持原来大小,而让长文本滚动
textFied.adjustsFontSizeToFitWidth = YES;
(18) 设置自动缩小显示的最小字体大小,adjustsFontSizeToFitWidth为YES才会起作用
text.minimumFontSize = 20;
(19) 设置键盘的样式
text.keyboardType = UIKeyboardTypeNumberPad;
typedef enum {
UIKeyboardTypeDefault, 默认键盘,支持所有字符
UIKeyboardTypeASCIICapable, 支持ASCII的默认键盘
UIKeyboardTypeNumbersAndPunctuation, 标准电话键盘,支持+*#字符
UIKeyboardTypeURL, URL键盘,支持.com按钮 只支持URL字符
UIKeyboardTypeNumberPad, 数字键盘
UIKeyboardTypePhonePad, 电话键盘
UIKeyboardTypeNamePhonePad, 电话键盘,也支持输入人名
UIKeyboardTypeEmailAddress, 用于输入电子 邮件地址的键盘
UIKeyboardTypeDecimalPad, 数字键盘 有数字和小数点
UIKeyboardTypeTwitter, 优化的键盘,方便输入@、#字符
UIKeyboardTypeAlphabet = UIKeyboardTypeASCIICapable,
} UIKeyboardType;
(20) 首字母是否大写
text.autocapitalizationType = UITextAutocapitalizationTypeNone;
typedef enum {
UITextAutocapitalizationTypeNone, 不自动大写
UITextAutocapitalizationTypeWords, 单词首字母大写
UITextAutocapitalizationTypeSentences, 句子的首字母大写
UITextAutocapitalizationTypeAllCharacters, 所有字母都大写
} UITextAutocapitalizationType;
(21) return键变成什么键
text.returnKeyType =UIReturnKeyDone;
typedef enum {
UIReturnKeyDefault, 默认 灰色按钮,标有Return
UIReturnKeyGo, 标有Go的蓝色按钮
UIReturnKeyGoogle,标有Google的蓝色按钮,用语搜索
UIReturnKeyJoin,标有Join的蓝色按钮
UIReturnKeyNext,标有Next的蓝色按钮
UIReturnKeyRoute,标有Route的蓝色按钮
UIReturnKeySearch,标有Search的蓝色按钮
UIReturnKeySend,标有Send的蓝色按钮
UIReturnKeyYahoo,标有Yahoo的蓝色按钮
UIReturnKeyEmergencyCall, 紧急呼叫按钮
} UIReturnKeyType;
(22) 键盘外观
textView.keyboardAppearance=UIKeyboardAppearanceDefault;
typedef enum {
UIKeyboardAppearanceDefault, 默认外观,浅灰色
UIKeyboardAppearanceAlert, 深灰 石墨色
} UIReturnKeyType;
(23) 设置代理 用于实现协议
text.delegate = self;
(24) 把textfield加到视图中
[self.window addSubview:text];
(25) 最右侧加图片是以下代码 左侧类似
UIImageView *image=[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"right.png"]];
text.rightView=image;
text.rightViewMode = UITextFieldViewModeAlways;
typedef enum {
UITextFieldViewModeNever,
UITextFieldViewModeWhileEditing,
UITextFieldViewModeUnlessEditing,
UITextFieldViewModeAlways
} UITextFieldViewMode;
(26) 按return键键盘往下收 becomeFirstResponder
类要采用UITextFieldDelegate协议
text.delegate = self; 声明text的代理是我,我会去实现把键盘往下收的方法 这个方法在UITextFieldDelegate里所以我们要采用UITextFieldDelegate这个协议
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
[text resignFirstResponder]; //主要是[receiver resignFirstResponder]在哪调用就能把receiver对应的键盘往下收
return YES;
}
(27) 重写绘制行为
除了UITextField对象的风格选项,你还可以定制化UITextField对象,为他添加许多不同的重写方法,来改变文本字段的显示行为。这些方法都会返回一个CGRect结构,制定了文本字段每个部件的边界范围。以下方法都可以重写。
– textRectForBounds: //重写来重置文字区域
– drawTextInRect: //改变绘文字属性.重写时调用super可以按默认图形属性绘制,若自己完全重写绘制函数,就不用调用super了.
– placeholderRectForBounds: //重写来重置占位符区域
– drawPlaceholderInRect: //重写改变绘制占位符属性.重写时调用super可以按默认图形属性绘制,若自己完全重写绘制函数,就不用调用super了.
– borderRectForBounds: //重写来重置边缘区域
– editingRectForBounds: //重写来重置编辑区域
– clearButtonRectForBounds: //重写来重置clearButton位置,改变size可能导致button的图片失真
– leftViewRectForBounds:
– rightViewRectForBounds:
(28) 委托方法
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{
//返回一个BOOL值,指定是否唤起文本字段开始编辑,返回NO时不能唤起键盘进行编辑
return YES;
}
- (void)textFieldDidBeginEditing:(UITextField *)textField{
//开始编辑时触发,文本字段将成为first responder
}
- (BOOL)textFieldShouldEndEditing:(UITextField *)textField{
//返回BOOL值,指定是否允许文本字段结束编辑,当编辑结束,文本字段会让出first responder
//要想在用户结束编辑时阻止文本字段消失,可以返回NO
//这对一些文本字段必须始终保持活跃状态的程序很有用,比如即时消息
return NO; //一直处于编辑状态
}
- (BOOL)textField:(UITextField*)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
//当用户使用自动更正功能,把输入的文字修改为推荐的文字时,就会调用这个方法。
//这对于想要加入撤销选项的应用程序特别有用
//可以跟踪字段内所做的最后一次修改,也可以对所有编辑做日志记录,用作审计用途。
//要防止文字被改变可以返回NO
//这个方法的参数中有一个NSRange对象,指明了被改变文字的位置,建议修改的文本也在其中
return YES;
}
- (BOOL)textFieldShouldClear:(UITextField *)textField{
//返回一个BOOL值指明是否允许根据用户请求清除内容
//可以设置在特定条件下才允许清除内容
return YES; //返回YES,输入内容后,点击右边的清除按钮可以清除,返回NO,点击清除不起作用
}
-(BOOL)textFieldShouldReturn:(UITextField *)textField{
//返回一个BOOL值,指明是否允许在按下回车键时结束编辑
//如果允许要调用resignFirstResponder 方法,这会导致结束编辑,而键盘会被收起[textField resignFirstResponder];
//查一下resign这个单词的意思就明白这个方法了
return YES;
}
(29) 通知
UITextField派生自UIControl,所以UIControl类中的通知系统在文本字段中也可以使用。除了UIControl类的标准事件,你还可以使用下列UITextField类特有的事件
只有这三个
UITextFieldTextDidBeginEditingNotification
UITextFieldTextDidChangeNotification
UITextFieldTextDidEndEditingNotification
当文本字段退出编辑模式时触发。通知的object属性存储了最终文本。
因为文本字段要使用键盘输入文字,所以下面这些事件发生时,也会发送动作通知
UIKeyboardWillShowNotification //键盘显示之前发送
UIKeyboardDidShowNotification //键盘显示之后发送
UIKeyboardWillHideNotification //键盘隐藏之前发送
UIKeyboardDidHideNotification //键盘隐藏之后发送
(30) 限制只能输入特定的字符
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
NSCharacterSet *cs;
//invertedSet方法是去反字符,把所有的除了NUMBERS 里的字符都找出来(包含去空格功能)
cs = [[NSCharacterSet characterSetWithCharactersInString:NUMBERS]invertedSet];
// componentsJoinedByString 用于根据一个字符串来将数组连接成一个新的字符串。
NSString *filtered = [[string componentsSeparatedByCharactersInSet:cs]componentsJoinedByString:@""]; //按cs分离出数组,数组按@""分离出字符串
BOOL canChange = [string isEqualToString:filtered];
return canChange;
//这样写了以后,输入非数字时不能输入
}
//上面那个NUMBERS是一个宏,可以在文件顶部定义:
#define NUMBERS @”0123456789n”
(这个代表可以输入数字和换行,请注意这个n,如果不写这个,Done按键将不会触发,如果用在SearchBar中,将会不触发Search事件,因为你自己限制不让输入n,好惨,我在项目中才发现的。)
所以,如果你要限制输入英文和数字的话,就可以把这个定义为:
#define kAlphaNum @”ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789″。
当然,你还可以在以上方法return之前,做一提示的,比如提示用户只能输入数字之类的。如果你觉得有需要的话。
(31) 限制只能输入一定长度的字符
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string;
{ //string就是此时输入的那个字符 textField就是此时正在输入的那个输入框 返回YES就是可以改变输入框的值 NO相反
if ([string isEqualToString:@"n"]) //按会车可以改变 这里这个字符写什么,就只能输入什么
{
return YES;
}
NSString * toBeString = [textField.text stringByReplacingCharactersInRange:range withString:string]; //得到输入框的内容
if (self.myTextField == textField) //判断是否时我们想要限定的那个输入框
{
if ([toBeString length] > 20) { //如果输入框内容大于20则弹出警告
textField.text = [toBeString substringToIndex:20];
UIAlertView *alert = [[[UIAlertView alloc] initWithTitle:nil message:@"超过最大字数不能输入了" delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil] autorelease];
[alert show];
/*
UIAlertController *alertView = [UIAlertController alertControllerWithTitle:@"提示"message:@"超过最大字数不能输入了" preferredStyle:UIAlertControllerStyleActionSheet];
[self presentViewController:alertViewanimated:YEScompletion:nil];
*/
return NO;
}
}
return YES;
}
4.UISlider的使用(继承UIControl)
UISlider *slider = [[UISlider alloc] initWithFrame:CGRectMake(100, 100, 200, 66)];//这里无论高度设为多少,都按其自己的默认高度显示
slider.minimumValue = 0;
slider.maximumValue = 1;
slider.value = 0.5;
slider.continuous = YES;//默认YES 如果设置为NO,则每次滑块停止移动后才触发事件
[slider addTarget:self action:@selector(changed:) forControlEvents:UIControlEventValueChanged];
//给滑块,最小值一边,最大值一边配置颜色
slider.minimumTrackTintColor = [UIColor redColor];
slider.maximumTrackTintColor = [UIColor yellowColor];
slider.thumbTintColor = [UIColor purpleColor];
//给滑块最大值、最小值一边设置图片
UIImage * image1 = [UIImage imageNamed:@"apple.jpg"];
UIImage * image2 = [UIImage imageNamed:@"dog.png"];
slider.minimumValueImage = image1;
slider.maximumValueImage = image2;
//手动设置滑块的值,并是否动画移动过去
- (void)setValue:(float)value animated:(BOOL)animated;
- (void)setThumbImage:(nullable UIImage *)image forState:(UIControlState)state; //给滑动按钮设置图片
- (void)setMinimumTrackImage:(nullable UIImage *)image forState:(UIControlState)state;//给滑道左侧设置图片
- (void)setMaximumTrackImage:(nullable UIImage *)image forState:(UIControlState)state;//给滑道右侧设置图片
可以自定义一个类继承自UISlider,然后重写这些方法,返回自定义的滑块的各个区域的大小
- (CGRect)minimumValueImageRectForBounds:(CGRect)bounds; //返回左边图片大小
- (CGRect)maximumValueImageRectForBounds:(CGRect)bounds; //返回右边图片大小
- (CGRect)trackRectForBounds:(CGRect)bounds; //返回滑道大小
- (CGRect)thumbRectForBounds:(CGRect)bounds trackRect:(CGRect)rect value:(float)value; //返回滑块大小
5.UISwitch的使用(继承:UIControl)
UISwitch *ss = [[UISwitch alloc] initWithFrame:CGRectMake(100, 100, 60, 30)];
[ss addTarget:self action:@selector(kg:) forControlEvents:UIControlEventValueChanged];
[self.view addSubview:ss];
tintColor:
开关处于关闭状态时边框的颜色(注意这边是边框的颜色)
onTintColor:
开关处于开启状态时的颜色
thumbTintColor:
开关的状态钮颜色
image
调整UISwitch 大小
UISwitch *sw = [[UISwitch alloc]initWithFrame:CGRectMake(200, 15, 50, 15)];
sw.transform = CGAffineTransformMakeScale( 0.5, 0.5);//缩放
1.1 CGAffineTransformMakeScale(CGFloat sx, CGFloat sy)
这个方法可以方便的对view的长和宽进行缩放,不改变view的中心点。注意!中心点不变指的是物理位置不变,不是坐标,因为坐标系此时已经发生改变
1.2 CGAffineTransformScale(CGAffineTransform t,CGFloat sx, CGFloat sy)
这个方法同样是view的长和宽进行缩放,效果类似CGAffineTransformMakeScale(CGFloat sx, CGFloat sy)不同的是这个方法可以叠加其他CGAffineTransform效果(比如旋转)
以上资料特别感谢https://www.jianshu.com/p/e6ef6eb04c6a
6.UIAlertController的使用( 对话框继承的是UIViewController ,不是UIControl)
/*
类方法快速创建一个提示控制器 值得注意的是这个控制器有个preferreStyle属性你可以根据这个属性来确定是使用UIAlertView 还是 UIActionSheet
UIAlertControllerStyleActionSheet
UIAlertControllerStyleAlert
*/
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"显示的标题" message:@"标题的提示信息" preferredStyle:UIAlertControllerStyleAlert];
[alertController addAction:[UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
NSLog(@"点击取消");
}]];
[alertController addAction:[UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
NSLog(@"点击确认");
}]];
[alertController addAction:[UIAlertAction actionWithTitle:@"警告" style:UIAlertActionStyleDestructive handler:^(UIAlertAction * _Nonnull action) {
NSLog(@"点击警告");
}]];
[alertController addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {
NSLog(@"添加一个textField就会调用 这个block");
}];
// 由于它是一个控制器 直接modal出来就好了
[self presentViewController:alertController animated:YES completion:nil];
7.UISegmentedControl的使用(继承:UIControl)
//声明对象
@property (nonatomic,strong) UISegmentedControl *segmentedcontrol;
//标题
NSArray *segmentArry = [NSArray arrayWithObjects:@"中国",@"美国",@"大不列颠英国",@"俄罗斯", nil];
//初始化
self.segmentedcontrol = [[UISegmentedControl alloc] initWithItems:segmentArry];
//iOS 7.0后被弃用
//self.segmentedcontrol.segmentedControlStyle = UISegmentedControlStylePlain;
self.segmentedcontrol.frame = CGRectMake(20, 40, self.view.frame.size.width-40, 30);
//默认值为NO,即点击后保持选中状态,如果设置为YES则,只是短暂的显示选中状态
self.segmentedcontrol.momentary = YES;
//指示控件是否根据其内容宽度来调整片段宽度
self.segmentedcontrol.apportionsSegmentWidthsByContent = YES;
//设置UISegmentedControl的边框、分割线、文字、点击后的颜色
self.segmentedcontrol.tintColor = [UIColor blueColor];
//通过Attribute字符串属性字典设置Segment标签属性(正常状态下)
[self.segmentedcontrol setTitleTextAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:15.0],NSForegroundColorAttributeName:[UIColor purpleColor]} forState:UIControlStateNormal];
//通过Attribute字符串属性字典设置Segment标签属性(选中状态下)
[self.segmentedcontrol setTitleTextAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:15.0],NSForegroundColorAttributeName:[UIColor redColor]} forState:UIControlStateSelected];
//添加事件
[self.segmentedcontrol addTarget:self action:@selector(segmentAction:) forControlEvents:UIControlEventValueChanged];
//UISegmentedControl的段数
NSInteger totelindext = self.segmentedcontrol.numberOfSegments;
//当前选中Segment
NSInteger selectindext = self.segmentedcontrol.selectedSegmentIndex;
NSLog(@"共分:%ld段,当前选中:%ld段",totelindext,selectindext);
//指定索引点插入新标题
[self.segmentedcontrol insertSegmentWithTitle:@"德国" atIndex:selectindext animated:YES];
//指定索引点插入新图片
[self.segmentedcontrol insertSegmentWithImage:[UIImage imageNamed:@"flag"] atIndex:selectindext animated:YES];
//移除指定Segment
[self.segmentedcontrol removeSegmentAtIndex:selectindext+1 animated:YES];
//移除全部Segment
[self.segmentedcontrol removeAllSegments];
//设置指定Segment的标题
[self.segmentedcontrol setTitle:@"日本" forSegmentAtIndex:0];
//返回指定Segment的标题
NSString *segmentTitle = [self.segmentedcontrol titleForSegmentAtIndex:0];
NSLog(@"索引为:0的标题设置为:%@",segmentTitle);
//设置指定Segment的image
[self.segmentedcontrol setImage:[UIImage imageNamed:@"flag"] forSegmentAtIndex:0];
//返回指定Segment的image
UIImage *segmentImage = [self.segmentedcontrol imageForSegmentAtIndex:0];
NSLog(@"索引为:0的图片设置为:%@",segmentImage);
//设置指定Segment的宽度 默认(0,0)自适应
[self.segmentedcontrol setWidth:100 forSegmentAtIndex:0];
//返回指定Segment的宽度
CGFloat segmentW = [self.segmentedcontrol widthForSegmentAtIndex:0];
NSLog(@"索引为:0的Segment宽度设置为:%.2f",segmentW);
//设置指定Segment的偏移量
[self.segmentedcontrol setContentOffset:CGSizeMake(5.0, 2.0) forSegmentAtIndex:0];
//获取指定Segment的偏移量
CGSize segmentSize = [self.segmentedcontrol contentOffsetForSegmentAtIndex:0];
NSLog(@"索引为:0的Segment偏移量设置为:%@", NSStringFromCGSize(segmentSize));
//设置指定Segment是否有效
[self.segmentedcontrol setEnabled:YES forSegmentAtIndex:0];
//返回指定Segment是否有效
BOOL segmentBool = [self.segmentedcontrol isEnabledForSegmentAtIndex:0];
NSLog(@"索引为:0的Segment当前是否可以点击:%@",segmentBool ? @"可以":@"不可以");
8.UISearchBar
UISearchBar *mySearchBar;
UITextField *searchField;//搜索文字区域
mySearchBar.backgroundImage = [[UIImage alloc] init];
mySearchBar.barTintColor = [UIColor whiteColor];
searchField = [mySearchBar valueForKey:@"searchField"];
if (searchField) {
[searchField setBackgroundColor:[UIColor whiteColor]];
searchField.frame = CGRectMake(8, 0, Fit3XSizeW(1064)-16, Fit3XSizeH(196));
searchField.layer.cornerRadius = searchField.height*0.26;
searchField.layer.borderColor = kTileBlackColor.CGColor;
searchField.layer.borderWidth = kMyBorderWidth;
searchField.layer.masksToBounds = YES;
}
//修正光标颜色
[searchField setTintColor:[UIColor blackColor]];
[mySearchBar changeLeftPlaceholder:@"搜索"];
9.UIScrollView
// 1. 默认 CGSizeZero == CGSizeMake(0, 0)
// contentSize 设置可以滚动的范围
scrollView.contentSize = CGSizeMake(1000, 1000);
// 2. 默认 CGPointZero
// contentOffset 偏移量, 滚动的位置
// 不设置contentSize, contentOffset也可以改变
// 问题: 改变contentOffset什么变了?
// 答案: 改变contentOffset, 实质上是对scrollView的bounds进行了改变.(改变子视图的坐标)
NSLog(@"scrollView frame is : %@", NSStringFromCGRect(scrollView.frame));
NSLog(@"scrollView bounds is : %@", NSStringFromCGRect(scrollView.bounds));
scrollView.contentOffset = CGPointMake(0, 500);
NSLog(@"scrollView frame is : %@", NSStringFromCGRect(scrollView.frame));
NSLog(@"scrollView bounds is : %@", NSStringFromCGRect(scrollView.bounds));
// 3. contentInset
// 添加滚动区域四周的滚动范围
// UIEdgeInsets age = {10, 10, 10, 10};
scrollView.contentInset = UIEdgeInsetsMake(10, 10, 10, 10);
// 4. directionalLockEnabled
// 锁定垂直或水平滚动(45度角, 锁会失效)
scrollView.directionalLockEnabled = YES;
// 5. bounces 回弹效果
// 边缘弹动动画关闭 NO
// scrollView.bounces = NO;
// 6. alwaysBounceVertical 在没有垂直方向的滚动范围时(0), 保证垂直方向的回弹效果
scrollView.alwaysBounceVertical = YES;
// 7. alwaysBounceHorizontal 在没有水平方向的滚动范围时(0), 保证垂直方向的回弹效果
scrollView.alwaysBounceHorizontal = YES;
// 8. pagingEnabled 按页滚动
scrollView.pagingEnabled = YES;
// 9. scrollEnabled 滚动视图能否滚动, 默认为YES, NO(不可以滚)
scrollView.scrollEnabled = YES;
// 10. showsHorizontalScrollIndicator 是否显示水平滚动指示器
scrollView.showsHorizontalScrollIndicator = YES;
// 11. showsVerticalScrollIndicator 是否显示垂直滚动的指示器
scrollView.showsVerticalScrollIndicator = YES;
// 12. 滚动指示器的边距
scrollView.scrollIndicatorInsets = UIEdgeInsetsMake(0, 100, 0, 0);
// 13. indicatorStyle 滚动指示器的颜色(深色背景丶浅色背景)
scrollView.indicatorStyle = UIScrollViewIndicatorStyleBlack;
// 14.
// scrollView.tracking 用户有没有开始拖动
// scrollView.tracking
// scrollView.dragging 用户是否正在拖动
// scrollView.dragging
// scrollView.decelerating 是否减速中
// scrollView.decelerating
// 14. scrollsToTop 滚动视图, 双击状态栏手势是否存在
scrollView.scrollsToTop = NO;
// 15. 代理
scrollView.delegate = self;
// 16. 键盘消失模式(一般用这个UIScrollViewKeyboardDismissModeOnDrag)
scrollView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;
// 测试:
UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(10, 300, kScreenWidth - 20, 200)];
textField.backgroundColor = [UIColor cyanColor];
[scrollView addSubview:textField];
// 17. 缩放系数
// 如果想进行视图放大缩小, 必须实现viewForZoomingInScrollview:
scrollView.minimumZoomScale = 2;
scrollView.maximumZoomScale = 6;
}
// 与其想要缩放的子视图绑定, scrollView的contentSize会跟随这个子视图改变
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {
return scrollView.subviews.firstObject;
}
// 滚动视图滚动, 就会执行
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
// tracking 用户触摸
if (scrollView.tracking) {
NSLog(@"正在拖动滚动");
} else {
NSLog(@"自己滚动中");
}
// dragging 用户开始滑动
if (scrollView.dragging) {
NSLog(@"");
}
// decelerating 用户触摸结束
if (scrollView.decelerating) {
NSLog(@"");
}
}
// 将要开始拖拽
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
// NSLog(@"开始拖拽");
}
// 将要结束拖拽
- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset {
}
// 将要开始进行减速
- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView {
// NSLog(@"开始减速");
}
// 已经结束减速
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
//NSLog(@"结束减速");
}
10.UIWebView
1.UIWebView的基础使用
1、创建UIWebView:
CGRect bouds = [[UIScreen manScreen]applicationFrame];
UIWebView* webView = [[UIWebView alloc]initWithFrame:bounds];
[self.view addSubview:webView];
2、设置UIWebView的相关属性:
webView.scalespageToFit = YES;//自动对页面进行缩放以适应屏幕
webView.detectsPhoneNumbers = YES;//自动检测网页上的电话号码,单击可以拨打
注意:我们在一个页面想拨打电话的时候,也可以调取webview拨打电话
UIWebView*callWebview =[[UIWebView alloc] init];
NSURL *telURL =[NSURL URLWithString:[NSString stringWithFormat:@"tel:%@",self.usersModel.mobile]];// 貌似tel:// 或者 tel: 都行
[callWebview loadRequest:[NSURLRequest requestWithURL:telURL]];
//记得添加到view上
[self.view addSubview:callWebview];
3、加载内容:
3.1、加载一个网页url:
NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];//创建URL
NSURLRequest* request = [NSURLRequest requestWithURL:url];//创建
[webView loadRequest:request];//加载
3.2、加载一个本地资源:
NSURL* url = [NSURL fileURLWithPath:filePath];//创建URL
NSURLRequest* request = [NSURLRequest requestWithURL:url];//创建
[webView loadRequest:request];//加载
设置webView的一些属性
[webView goBack];//后退
[webView goForward];//控制前进
[webView reload];//重载
[webView stopLoading];//取消载入内容
4、UIWebView的代理:
-(void)webViewDidStartLoad:(UIWebView*)webView ;//当网页视图已经开始加载一个请求后,得到通知。
-(void)webViewDidFinishLoad:(UIWebView*)webView ;//当网页视图结束加载一个请求之后,得到通知。
-(void)webView:(UIWebView*)webView DidFailLoadWithError:(NSError*)error;//当在请求加载中发生错误时,得到通知。会提供一个NSSError对象,以标识所发生错误类型。
2.加载UIWebView需要注意的点
1、处理UIWebView加载网页展示doc、txt、xls等等的文档乱码问题:
1.1 处理展示txt文档乱码问题:
if ([theType isEqualToString:@".txt"]){
//txt分带编码和不带编码两种,带编码的如UTF-8格式txt,不带编码的如ANSI格式txt。不带的,可以依次尝试GBK和GB18030编码
NSString* aStr = [[NSString alloc] initWithData:attachmentData encoding:NSUTF8StringEncoding];
if (!aStr){
//用GBK进行编码
aStr=[[NSString alloc] initWithData:attachmentData encoding:0x80000632];
}
if (!aStr){
//用GBK编码不行,再用GB18030编码
aStr=[[NSString alloc] initWithData:attachmentData encoding:0x80000631];
}
加载完成之后,会显示不全,可用textview进行排版,或者是通过html进行排版,下面列举html进行排版:
NSString* responseStr = [NSString stringWithFormat:
@""
""
""
""
"%@"
"/pre>"
""
"",
aStr];
[attachmentWebView loadHTMLString:responseStr baseURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]]];
return;
}
其他的处理乱码就用utf8转化就ok。
2、取消长按webView上的链接弹出actionSheet的问题:
-(void)webViewDidFinishLoad:(UIWebView *)webView{
[webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitTouchCallout = 'none';"];
}
3、取消webView上的超级链接加载问题:
-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
if (navigationType==UIWebViewNavigationTypeLinkClicked) {
return NO;
}else {
return YES;
}
}
4、删除 webView的cookie的方法:
-(void)deleteCookieForDominPathStr:(NSString *)thePath
{
//删除本地cookie,thePath为cookie路径通过打印cookie可知道其路径
for(NSHTTPCookie *cookie in [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]) {
if([[cookie domain] isEqualToString:thePath]) {
[[NSHTTPCookieStorage sharedHTTPCookieStorage] deleteCookie:cookie];}
}
}
5、根据内容获取UIWebView的高度:
1.1 .使用sizeThatFits方法:
-(void)webViewDidFinishLoad:(UIWebView *)webView{
CGRect frame = webView.frame;
frame.size.height = 1;
webView.frame = frame;
CGSize fittingSize = [webView sizeThatFits:CGSizeZero];
frame.size = fittingSize;
webView.frame = frame;
}
这个需要注意:使用 sizeThatFits前,先将UIWebView的高度设为最小,即1,再次调用就会返回最合适的大小
1.2 使用JavaScript方法
-(void)webViewDidFinishLoad:(UIWebView *)webView{
CGRect frame = webView.frame;
NSString *fitHeight = [webview stringByEvaluatingJavaScriptFromString:@"document.body.scrollHeight;"];
frame.size.height = [fitHeight floatValue];
webView.frame = frame;
}
3.iOS与js的交互问题
1、OC掉JS的方法:
第一步:需要添加系统库 JavaScriptCore.framework,引入头文件#import <JavaScriptCore/JavaScriptCore.h>
第二步:创建webview
第三步:创建 JSContext 桥梁
-(void)webViewDidFinishLoad:(UIWebView *)webView {
//创建JSContext 对象
JSContext *context=[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
NSString *alertJS=@"alert('我是拉拉吖')"; //准备执行的js代码
[context evaluateScript:alertJS];//通过oc方法调用js的alert
}
2、JS调用OC方法:
例如:我们的app最近开发的七夕开奖活动,每次打开app,如果没开奖,就会有百宝箱,提示打开百宝箱
第一步:需要添加系统库 JavaScriptCore.framework,引入头文件#import <JavaScriptCore/JavaScriptCore.h>
第二步:创建webview
第三步:创建 JSContext 桥梁
第四步:规定名称:TestJSObject
第五步:规定方法带参数的:-(void)TestOneParameter:(NSString *)message
@property (nonatomic, strong) JSContext *jsContext;
-(void)webViewDidFinishLoad:(UIWebView *)webView {
//建立连接
self.jsContext = (JSContext *)[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
self.jsContext.exceptionHandler = ^(JSContext *con, JSValue *exception) {
NSLog(@"%@", exception);
con.exception = exception;
};
//创建对象,处理来自JS调用的类
TestJSObject *textJS = [[TestJSObject alloc] init];
self.jsContext[@"TestJSObject"]= textJS;
}
重写TestJSObject类
#import <Foundation/Foundation.h>
#import <JavaScriptCore/JavaScriptCore.h>
//首先创建一个实现了JSExport协议的协议
@protocol TestJSObjectProtocol <JSExport>
//此处我们测试几种参数的情况
-(void)TestNOParameter;
-(void)TestOneParameter:(NSString *)message;
@end
//让我们创建的类实现上边的协议
@interface TestJSObject : NSObject<TestJSObjectProtocol>
@end
#import "TestJSObject.h"
@implementation TestJSObject
-(void)TestOneParameter:(NSString *)message
{
NSLog(@"this is ios TestOneParameter=%@",message);
}
@end
注意:如果js是多个参数的话 我们代理方法的所有变量前的名字连起来要和js的方法名字一样
比如: js方法为 testobject.TestTowParameterSecondParameter('参数A','参数B')
他有两个参数 那么我们的代理方法 就是把js的方法名 TestTowParameterSecondParameter 任意拆分成两段作为代理方法名
-(void)TestTowParameter:(NSString *)message1 SecondParameter:(NSString *)message2;
3、使用第三方的WebViewJavascriptBridge
第一步:导入第三方WebViewJavascriptBridge
第二步:引入头文件:#import "WebViewJavascriptBridge.h"
第三步:同js方规定方法:@"pushAppParam"
@property (nonatomic,strong) WebViewJavascriptBridge *bridge;
- (void)viewDidLoad{
//调用方法
[self addInitWebViewJavascriptBridge];
}
实现方法
- (void) addInitWebViewJavascriptBridge{
self.bridge = [WebViewJavascriptBridge bridgeForWebView:self.webView];
[self.bridge setWebViewDelegate:self];
[self.bridge registerHandler:@"pushAppParam" handler:^(id data, WVJBResponseCallback responseCallback) {
NSDictionary *dic = data;
//实现需要的功能
}
];
}