博客> 各种视图的理解,包括层次结构,视图属性的理解
各种视图的理解,包括层次结构,视图属性的理解
2017-10-18 11:31 评论:0 阅读:388 诸葛亮倒骑小毛驴
ios 视图 层次结构

一- ###UIView属性 1.alpha 设置视图的透明度.默认为1. // 完全透明 view.alpha = 0; // 不透明 view.alpha = 1; 2.clipsToBounds // 默认是NO,当设置为yes时,超出当前视图的尺寸的内容和子视图不会显示。 view.clipsToBounds = YES; 3.hidden // 默认是NO,当设置为yes,视图就看不见了。 view.hidden = YES;

4.userInteractionEnabled // 默认为YES,如果设置为No,view就不能和用户交互了。(即不能响应事件) view.userInteractionEnabled = NO;

  1. tag // 默认为0,用来标记视图的 view.tag = 0;
  2. exclusiveTouch 默认为No exclusiveTouch的意义在于:如果当前设置了exclusiveTouch的UIView是整个触摸事件的第一响应者,那么到你所有的手指离开屏幕前其他的UIView是无法接受到整个事件周期内所有的触摸事件。 6.CGRect frame 1> 表示控件的位置和尺寸(以父控件的左上角为坐标原点(0, 0)) 2> 修改这个属性,可以调整控件的位置和尺寸

7.CGPoint center 1> 表示控件的中点(以父控件的左上角为坐标原点) 2> 修改这个属性,可以调整控件的位置

8.CGRect bounds 1> 表示控件的位置和尺寸(以自己的左上角位坐标原点,位置永远是(0, 0)) 2> 修改这个属性,只能调整控件的尺寸

9.CGAffineTransform transform 1> 表示控件的形变状态(旋转角度、缩放比例) 2> 创建CGAffineTransform的函数

  • CGAffineTransformMakeScale(CGFloat sx, CGFloat sy) 创建一个x、y方向的缩放比例分别为sx、sy的形变值

  • CGAffineTransformMakeRotation(CGFloat angle) 创建一个旋转角度为angle的形变值

  • CGAffineTransformScale(CGAffineTransform t, CGFloat sx, CGFloat sy) 在形变值t的基础上,再进行缩放,x、y方向的缩放比例分别为sx、sy,然后返回一个新的形变值

  • CGAffineTransformRotate(CGAffineTransform t, CGFloat angle) 在形变值t的基础上,再进行旋转,旋转角度为angle,然后返回一个新的形变值 10.superview 返回当前视图的父视图。(只读) 11.window 返回当前视图的窗口。(窗口)

获取根视图的superview和window时,需要注意,在viewdidload中是获取不到的,viewdidload只是视图加载完成,并没有添加到窗口中,因此需要在viewDidAppear方法中才能获取到。那时候视图才被添加到窗口中。

  • (void)viewDidLoad { [super viewDidLoad]; NSLog(@"%@",self.view.superview); // 没有值 NSLog(@"%@", self.view.window); // 没有值 }
  • (void)viewDidAppear:(BOOL)animated { NSLog(@"%@",self.view.superview); // 有值 NSLog(@"%@", self.view.window); // 有值 }

12.autoresizesSubviews 默认为YES,表示当父视图尺寸改变时,子视图也会随着改变。 13.autoresizingMask 默认为UIViewAutoresizingNone,不会自动伸缩。 14.contentMode 设置内容模式。 UIViewContentModeScaleToFill 不按照原宽高比例(长和宽不等比例增长)以任意比例填充。这样视图不会有空白,且内容可以全部显示。 UIViewContentModeAspectToFill 按照原长宽比例填充,不完全显示全部内容。这样内容可能溢出,但整个视图不会留有空白。 UIViewContentModeAspectToFit 按照原长宽比例(长和宽等比例增长),完全显示全部内容。这样容易照成左右或者上下留有空白。 15.backgroundColor 默认是nil。 // 设置背景颜色为红色 self.view.backgroundColor = [UIColor redColor]; 16.UIView常用添加子视图方法

  1. //加一个视图到一个视图里面
  2. addSubview:
  3. //将一个视图移到前面
  4. bringSubviewToFront:
  5. //将一个视图推送到背后
  6. sendSubviewToBack:
  7. //把视图移除
  8. removeFromSuperview
  9. //插入视图 并指定索引
  10. insertSubview:atIndex:
  11. //插入视图在某个视图之上
  12. insertSubview:aboveSubview:
  13. //插入视图在某个视图之下
  14. insertSubview:belowSubview:
  15. //交换两个位置索引的视图
  16. exchangeSubviewAtIndex:withSubviewAtIndex:

二.UITextView

  1. text: 设置textView中文本 _textView.text = @"Now is the time for all good developers to come to serve their country.\n\nNow is the time for all good developers to come to serve their country."; // 设置它显示的内容
  2. font:设置textView中文字的字体 _textView.font = [UIFont fontWithName:@"Arial" size:18.0]; // 设置字体名字和字体大小

  3. textColor:设置textView中文本的颜色 _textView.textColor = [UIColor blackColor]; // 设置textview里面的字体颜色

  4. textAlignment:设置textView的文本的排列方式 _textView.textAlignment = NSTextAlignmentCenter; // textView中的文本排列,默认靠左

  5. backgroundColor:设置textView的背景颜色 _textView.backgroundColor = [UIColor grayColor]; // 设置浅灰色的背景色,默认为白色

  6. delegate:设置代理 _textView.delegate = self; // 设置代理

  7. editable:设置textView是否可被输入 _textView.editable = NO; // textView是否可被输入,默认为YES

  8. attributedText:设置默认插入textView的文字 _textView.attributedText = [[NSAttributedString alloc]initWithString:@"attributedText__-abc"]; // 可以方便将文本插入到UITextView中。

  9. inputView:设置从底部弹出的视图 _textView.inputView = [[UIDatePicker alloc]init]; // 弹出视图,默认为键盘

  10. inputAccessoryView:设置弹出视图上方的辅助视图 _textView.inputAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; // 弹出视图上方的辅助视图

  11. clearsOnInsertion:设置textView获得焦点,在用户使用虚拟键盘进行输入时,清除之前的文本 _textView.clearsOnInsertion = YES; // clearsOnInsertion,默认为NO

三.UITextField属性

  1. enablesReturnKeyAutomatically 默认为No,如果设置为Yes,文本框中没有输入任何字符的话,右下角的返回按钮是disabled的。 1.borderStyle 设置边框样式,只有设置了才会显示边框样式  text.borderStyle = UITextBorderStyleRoundedRect;  typedef enum { UITextBorderStyleNone, UITextBorderStyleLine, UITextBorderStyleBezel, UITextBorderStyleRoundedRect
    } UITextBorderStyle;

2.backgroundColor  设置输入框的背景颜色,此时设置为白色 如果使用了自定义的背景图片边框会被忽略掉    text.backgroundColor = [UIColor whiteColor]; 3.background 设置背景 text.background = [UIImage imageNamed:@"dd.png"];//UITextField 的背景,注意只有UITextBorderStyleNone的时候改属性有效

设置enable为no时,textfield的背景 text.disabledBackground = [UIImage imageNamed:@"cc.png"];

4.placeholder 当输入框没有内容时, 提示内容为password text.placeholder = @"password"; 5.font 设置输入框内容的字体样式和大小 text.font = [UIFont fontWithName:@"Arial" size:20.0f];

  1. textColor 设置字体颜色 text.textColor = [UIColor redColor];
  2. clearButtonMode 输入框中是否有个叉号,在什么时候显示,用于一次性删除输入框中的内容 text.clearButtonMode = UITextFieldViewModeAlways; typedef enum { UITextFieldViewModeNever, 重不出现 UITextFieldViewModeWhileEditing, 编辑时出现 UITextFieldViewModeUnlessEditing, 除了编辑外都出现 UITextFieldViewModeAlways  一直出现 } UITextFieldViewMode;

  3. text 输入框中一开始就有的文字 text.text = @"一开始就在输入框的文字";
  4. secureTextEntry 每输入一个字符就变成点 用来输入密码时,设置这个属性。 text.secureTextEntry = YES;
  5. autocorrectionType 是否纠错 text.autocorrectionType = UITextAutocorrectionTypeNo; typedef enum { UITextAutocorrectionTypeDefault, 默认 UITextAutocorrectionTypeNo,  不自动纠错 UITextAutocorrectionTypeYes, 自动纠错 } UITextAutocorrectionType;

  6. clearsOnBeginEditing 再次编辑就清空 text.clearsOnBeginEditing = YES;
  7. textAlignment 内容对齐方式 text.textAlignment = UITextAlignmentLeft;
  8. contentVerticalAlignment 内容的垂直对齐方式 UITextField继承自UIControl,此类中有一个属性contentVerticalAlignment text.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
  9. adjustsFontSizeToFitWidth 设置为YES时文本会自动缩小以适应文本窗口大小.默认是保持原来大小,而让长文本滚动  textFied.adjustsFontSizeToFitWidth = YES; //设置自动缩小显示的最小字体大小 text.minimumFontSize = 20;

  10. keyboardType 设置键盘的样式 text.keyboardType = UIKeyboardTypeNumberPad; typedef enum { UIKeyboardTypeDefault,  默认键盘,支持所有字符
    UIKeyboardTypeASCIICapable, 支持ASCII的默认键盘 UIKeyboardTypeNumbersAndPunctuation, 标准电话键盘,支持+*#字符 UIKeyboardTypeURL, URL键盘,支持.com按钮 只支持URL字符 UIKeyboardTypeNumberPad,  数字键盘 UIKeyboardTypePhonePad,   电话键盘 UIKeyboardTypeNamePhonePad,  电话键盘,也支持输入人名 UIKeyboardTypeEmailAddress,  用于输入电子 邮件地址的键盘
    UIKeyboardTypeDecimalPad,  数字键盘 有数字和小数点 UIKeyboardTypeTwitter,  优化的键盘,方便输入@、#字符 UIKeyboardTypeAlphabet = UIKeyboardTypeASCIICapable, } UIKeyboardType; 16.autocapitalizationType 首字母是否大写 text.autocapitalizationType = UITextAutocapitalizationTypeNone; typedef enum { UITextAutocapitalizationTypeNone, 不自动大写 UITextAutocapitalizationTypeWords, 单词首字母大写 UITextAutocapitalizationTypeSentences, 句子的首字母大写 UITextAutocapitalizationTypeAllCharacters, 所有字母都大写 } UITextAutocapitalizationType;
  11. returnKeyType return键变成什么键 text.returnKeyType =UIReturnKeyDone; typedef enum { UIReturnKeyDefault, 默认 灰色按钮,标有Return UIReturnKeyGo,  标有Go的蓝色按钮 UIReturnKeyGoogle,标有Google的蓝色按钮,用语搜索 UIReturnKeyJoin,标有Join的蓝色按钮 UIReturnKeyNext,标有Next的蓝色按钮 UIReturnKeyRoute,标有Route的蓝色按钮 UIReturnKeySearch,标有Search的蓝色按钮 UIReturnKeySend,标有Send的蓝色按钮 UIReturnKeyYahoo,标有Yahoo的蓝色按钮 UIReturnKeyYahoo,标有Yahoo的蓝色按钮 UIReturnKeyEmergencyCall, 紧急呼叫按钮 } UIReturnKeyType;
  12. keyboardAppearance 键盘外观 textView.keyboardAppearance=UIKeyboardAppearanceDefault; typedef enum { UIKeyboardAppearanceDefault, 默认外观,浅灰色 UIKeyboardAppearanceAlert,   深灰 石墨色 } UIReturnKeyType;

    1. delegate 设置代理 用于实现协议 text.delegate = self;
  13. rightView 最右侧加图片是以下代码  左侧类似 UIImageView *image=[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"right.png"]]; text.rightView=image; text.rightViewMode = UITextFieldViewModeAlways; typedef enum { UITextFieldViewModeNever, UITextFieldViewModeWhileEditing, UITextFieldViewModeUnlessEditing, UITextFieldViewModeAlways } UITextFieldViewMode;

  14. editing 是否允许编辑。

22.界面重写绘制行为 除了UITextField对象的风格选项,你还可以定制化UITextField对象,为他添加许多不同的重写方法,来改变文本字段的显示行为。这些方法都会返回一个CGRect结构,制定了文本字段每个部件的边界范围。以下方法都可以重写。

– textRectForBounds:    //重写来重置文字区域 – drawTextInRect:    //改变绘文字属性.重写时调用super可以按默认图形属性绘制,若自己完全重写绘制函数,就不用调用super了. – placeholderRectForBounds:  //重写来重置占位符区域 – drawPlaceholderInRect:  //重写改变绘制占位符属性.重写时调用super可以按默认图形属性绘制,若自己完全重写绘制函数,就不用调用super了. – borderRectForBounds:  //重写来重置边缘区域 – editingRectForBounds:  //重写来重置编辑区域 – clearButtonRectForBounds:  //重写来重置clearButton位置,改变size可能导致button的图片失真 – leftViewRectForBounds: – rightViewRectForBounds:

22.调整键盘 inputView //代替标准的系统键盘 inputAccessoryView //编辑时显示在系统键盘或用户自定义的inputView上面的视图

  1. delegate 类要遵守UITextFieldDelegate协议

text.delegate = self; 声明text的代理是我,我会去实现把键盘往下收的方法 这个方法在UITextFieldDelegate里所以我们要遵守UITextFieldDelegate这个协议

  • (BOOL)textFieldShouldReturn:(UITextField *)textField { [text resignFirstResponder]; //主要是[receiver resignFirstResponder]在哪调用就能把receiver(text)对应的键盘往下收 return YES; }

代理方法

  • (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{     //返回一个BOOL值,YES代表允许编辑,NO不允许编辑.  return YES;  } 

  • (void)textFieldDidBeginEditing:(UITextField *)textField{  //开始编辑时触发,文本字段将成为first responder  } 

  • (BOOL)textFieldShouldEndEditing:(UITextField *)textField{  //返回BOOL值,指定是否允许文本字段结束编辑,当编辑结束,文本字段会让出first responder    //要想在用户结束编辑时阻止文本字段消失,可以返回NO ,返回NO,点击键盘的返回按钮会无效果。   //这对一些文本字段必须始终保持活跃状态的程序很有用,比如即时消息    return NO;  } 
  • (void)textFieldDidEndEditing:(UITextField *)textField;{

}// 上面返回YES后执行;上面返回NO时有可能强制执行(e.g. view removed from window)

  • (BOOL)textField:(UITextField)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString )string{  //当用户使用自动更正功能,把输入的文字修改为推荐的文字时,就会调用这个方法。  //这对于想要加入撤销选项的应用程序特别有用  //可以跟踪字段内所做的最后一次修改,也可以对所有编辑做日志记录,用作审计用途。   //要防止文字被改变可以返回NO  //这个方法的参数中有一个NSRange对象,指明了被改变文字的位置,建议修改的文本也在其中 

  return YES;  } 

  • (BOOL)textFieldShouldClear:(UITextField *)textField{ 

//返回一个BOOL值指明是否允许根据用户请求清除内容  //可以设置在特定条件下才允许清除内容 

  return YES;  } 

-(BOOL)textFieldShouldReturn:(UITextField *)textField{ 

//返回一个BOOL值,指明是否允许在按下回车键时结束编辑  //如果允许要调用resignFirstResponder 方法,这回导致结束编辑,而键盘会被收起[textField resignFirstResponder]; //查一下resign这个单词的意思就明白这个方法了    return YES;  } 

24.通知 UITextField派生自UIControl,所以UIControl类中的通知系统在文本字段中也可以使用。除了UIControl类的标准事件,你还可以使用下列UITextField类特有的事件

UITextFieldTextDidBeginEditingNotification UITextFieldTextDidChangeNotification UITextFieldTextDidEndEditingNotification 当文本字段退出编辑模式时触发。通知的object属性存储了最终文本。

因为文本字段要使用键盘输入文字,所以下面这些事件发生时,也会发送动作通知

UIKeyboardWillShowNotification  //键盘显示之前发送 UIKeyboardDidShowNotification  //键盘显示之后发送 UIKeyboardWillHideNotification  //键盘隐藏之前发送 UIKeyboardDidHideNotification  //键盘隐藏之后发送

25.Stroyboard中: 1、Text :设置文本框的默认文本。 2、Placeholder : 可以在文本框中显示灰色的字,用于提示用户应该在这个文本框输入什么内容。当这个文本框中输入了数据时,用于提示的灰色的字将会自动消失。 3、Background : 4、Disabled : 若选中此项,用户将不能更改文本框内容。 5、接下来是三个按钮,用来设置对齐方式。 6、Border Style : 选择边界风格。 7、Clear Button : 这是一个下拉菜单,你可以选择清除按钮什么时候出现,所谓清除按钮就是出一个现在文本框右边的小 X ,你可以有以下选择: 7.1 Never appears : 从不出现 7.2 Appears while editing : 编辑时出现 7.3 Appears unless editing : 7.4 Is always visible : 总是可见 8、Clear when editing begins : 若选中此项,则当开始编辑这个文本框时,文本框中之前的内容会被清除掉。比如,你现在这个文本框 A 中输入了 "What" ,之后去编辑文本框 B,若再回来编辑文本框 A ,则其中的 "What" 会被立即清除。 9、Text Color : 设置文本框中文本的颜色。 10、Font : 设置文本的字体与字号。 11、Min Font Size : 设置文本框可以显示的最小字体(不过我感觉没什么用) 12、Adjust To Fit : 指定当文本框尺寸减小时,文本框中的文本是否也要缩小。选择它,可以使得全部文本都可见,即使文本很长。但是这个选项要跟 Min Font Size 配合使用,文本再缩小,也不会小于设定的 Min Font Size 。 接下来的部分用于设置键盘如何显示。 13、Captitalization : 设置大写。下拉菜单中有四个选项: 13.1 None : 不设置大写 13.2 Words : 每个单词首字母大写,这里的单词指的是以空格分开的字符串 13.3 Sentances : 每个句子的第一个字母大写,这里的句子是以句号加空格分开的字符串 13.4 All Characters : 所以字母大写 14、Correction : 检查拼写,默认是 YES 。 15、Keyboard : 选择键盘类型,比如全数字、字母和数字等。 16、Appearance: 17、Return Key : 选择返回键,可以选择 Search 、 Return 、 Done 等。 18、Auto-enable Return Key : 如选择此项,则只有至少在文本框输入一个字符后键盘的返回键才有效。 19、Secure : 当你的文本框用作密码输入框时,可以选择这个选项,此时,字符显示为星号。

1.Alignment Horizontal 水平对齐方式 2.Alignment Vertical 垂直对齐方式 3.用于返回一个BOOL值 输入框是否 Selected(选中) Enabled(可用) Highlighted(高亮)

26.UITextField实例一 : UITextField限制字符 (只为数字)

ios代码

  1. define ALPHA @"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz "

  2. define NUMBERS @"0123456789n"

  3. define ALPHANUM @"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 "

  4. define NUMBERSPERIOD @"0123456789."

    • (BOOL)textField:(UITextField )textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString )string
  5. {
  6. NSCharacterSet *cs;
  7. cs = [[NSCharacterSet characterSetWithCharactersInString:NUMBERSPERIOD ] invertedSet]; //invertedSet 方法是去反字符,把所有的除了数字的字符都找出来
  8. NSString *filtered = [[string componentsSeparatedByCharactersInSet:cs] componentsJoinedByString:@""]; //componentsSeparatedByCharactersInSet 方法是把输入框输入的字符string 根据cs中字符一个一个去除cs字符并分割成单字符并转化为 NSArray, 然后componentsJoinedByString 是把NSArray 的字符通过 ""无间隔连接成一个NSString字符 赋给filtered.就是只剩数字了.
  9. BOOL basicTest = [string isEqualToString:filtered];
  10. if(!basicTest)
  11. {
  12. UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"提示"
  13. message:@"请输入数字"
  14. delegate:nil
  15. cancelButtonTitle:@"确定"
  16. otherButtonTitles:nil];
  17. [alert show];
  18. [alert release];
  19. return NO;
  20. }
  21. // Add any predicate testing here
  22. return basicTest;
  23. }

define NUMBERS @”0123456789n” (这个代表可以输入数字和换行,请注意这个n,如果不写这个,Done按键将不会触发,如果用在SearchBar中,将会不触发Search事件,因为你自己限制不让输入n,好惨,我在项目中才发现的。) 所以,如果你要限制输入英文和数字的话,就可以把这个定义为: #define kAlphaNum @”ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789″。 当然,你还可以在以上方法return之前,做一提示的,比如提示用户只能输入数字之类的。如果你觉得有需要的话。

实例:限制只能输入一定长度的字符 ios代码

    • (BOOL)textField:(UITextField )textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString )string;
  1. { //string就是此时输入的那个字符 textField就是此时正在输入的那个输入框 返回YES就是可以改变输入框的值 NO相反
  2.  
  3. if ([string isEqualToString:@"n"]) //按回车可以改变
  4. {
  5. return YES;
  6. }
  7. NSString * toBeString = [textField.text stringByReplacingCharactersInRange:range withString:string]; //得到输入框的内容
  8. if (self.myTextField == textField) //判断是否时我们想要限定的那个输入框
  9. {
  10. if ([toBeString length] > 20) { //如果输入框内容大于20则弹出警告
  11. textField.text = [toBeString substringToIndex:20];
  12. UIAlertView *alert = [[[UIAlertView alloc] initWithTitle:nil message:@"超过最大字数不能输入了" delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil] autorelease];
  13. [alert show];
  14. return NO;
  15. }
  16. }
  17. return YES;
  18. }

27.UITextField实例二: 在UISearchBar中,当输入信息改变时,它就会调用textDidChange函数,但是UITextField没有这个功能,唯一与这个类似的shouldChangeCharactersInRange函数,也是在文件还没有改变前就调用了,而不是在改变后调用,要想实现这个功能,我们可以增加事件监听的方式.先来看看objective-c提供的接口: ios代码

  1. // add target/action for particular event. you can call this multiple times and you can specify multiple target/actions for a particular event.
  2. 给特殊事件添加目标或者方法,你能够调用这个方法多次,给特殊事件指定很多目标或者方法
  3. // passing in nil as the target goes up the responder chain. The action may optionally include the sender and the event in that order
  4. 给target传递空,会建立响应链,在这行命令,方法可以选择包含方法发送者和事件两个参数。
  5. // the action cannot be NULL. 方法不能为空。
    • (void)addTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents;
      怎么去使用这个接口呢?主要分为两步,第一步就是在UItextField组件中增加对文件编辑改变时事件的监听,然后再实现监听器监听到事件时,所调用的方法. ios代码
  6. //第一步,对组件增加监听器 可以在viewDidLoad 方法中加入 textField 为你自定义输入框的名称
  7. [textField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];
  8. ...
  9. //第二步,实现回调函数
    • (void) textFieldDidChange:(id) sender {
  10. UITextField _field = (UITextField )sender;
  11. NSLog(@"%@",[_field text]);
  12. }

28.UITextField实例三: UITextField控件处理键盘弹出时遮住输入框的问题 打开键盘卷动文本字段 默认情况下打开键盘会遮住下面的view,带来一点点困扰,不过这不是什么大问题,我们使用点小小的手段就可以解决。

首先我们要知道键盘的高度是固定不变的,不过在IOS 5.0 以后键盘的高度貌似不是216了,不过不要紧,我们调整调整就是了:

iPhone ipad 竖屏(portrait) 216 264 横屏(landScape) 140 352

我们采取的方法就是在textField(有可能是其他控件)接收到弹出键盘事件时把self.view整体上移216px了(我们就以iPhone竖屏为例了)。 首先我们要设置textField的代理,我们就设为当前控制器了。

ios代码

  1. textField,delegate=self;

然后我们在当前控制器实现下面两个委托方法: ios代码

    • (void)textFieldDidBeginEditing:(UITextField *)textField
  1. { //当点触textField内部,开始编辑都会调用这个方法。textField将成为first responder
  2. NSTimeInterval animationDuration = 0.30f;
  3. CGRect frame = self.view.frame;
  4. frame.origin.y -=216;
  5. frame.size.height +=216;
  6. self.view.frame = frame;
  7. [UIView beginAnimations:@"ResizeView" context:nil];
  8. [UIView setAnimationDuration:animationDuration];
  9. self.view.frame = frame;
  10. [UIView commitAnimations];
  11. }
    ios代码
    • (BOOL)textFieldShouldReturn:(UITextField *)textField
  12. {//当用户按下ruturn,把焦点从textField移开那么键盘就会消失了
  13. NSTimeInterval animationDuration = 0.30f;
  14. CGRect frame = self.view.frame;
  15. frame.origin.y +=216;
  16. frame.size. height -=216;
  17. self.view.frame = frame;
  18. //self.view移回原位置
  19. [UIView beginAnimations:@"ResizeView" context:nil];
  20. [UIView setAnimationDuration:animationDuration];
  21. self.view.frame = frame;
  22. [UIView commitAnimations];
  23. [textField resignFirstResponder];
  24. }

四.UITableView UITableView内置了两种样式:UITableViewStylePlain,UITableViewStyleGrouped

里的方法: tableView处理步骤 #pragma mark 1.有多少组 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView #pragma mark 2.第section组头部控件有多高 - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section #pragma mark 3.第section组有多少行 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section #pragma mark 4.indexPath这行的cell有多高 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath #pragma mark 5.indexPath这行的cell长什么样子 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath #pragma mark 6.第section组头部显示什么控件 - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section //每当有一个cell进入视野屏幕就会调用,所以在这个方法内部就需要优化。 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ if(cell==nil){ //在这里面做创建的工作。循环优化。防止刷新cell进入屏幕的时候重复的创建 } } //当调用reloadData的时候,会重新刷新调用数据源内所有方法,其他事情都不会做呀 [self reloadData] //这个方法只有在一开始有多少条数据才会算多少个高度,这个方法只会调用一次,但是每次reloadData的时候也会调用 //而且会一次性算出所有cell的高度,比如有100条数据,一次性调用100次 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath -(NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView //右侧索引 -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath //行点击事件 NSIndexPath *path = [self.tableView indexPathForSelectedRow]; //获得被选中的indexPath可以得到section,row [self.tableView reloadRowsAtIndexPaths:[self.tableView indexPathsForSelectedRows] withRowAnimation:UITableViewRowAnimationNone]; //刷新table指定行的数据 [self.tableView reloadData]; //刷新table所有行的数据 UITableView常用属性: UITableView *tableView = [[UITableView alloc]initWithFrame:CGRectMake(0, 0, 320, 460) style:UITableViewStylePlain]; // 初始化表格 分隔线属性 tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine; //UITableViewCellSeparatorStyleNone; [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone]; //取消分隔线 tableView.separatorColor = [UIColor lightGrayColor]; 条目多选 tableView.allowsMultipleSelection = YES; // 设置标题行高 [_tableView setSectionHeaderHeight:kHeaderHeight]; [_tableView setSectionFooterHeight:0]; // 设置表格行高 [_tableView setRowHeight:50]; //设置背景色 self.tableView.backgroundView 优先级高,如果要设置backgroundColor的时候要先把view设置为nil self.tableView.backgroundColor //在tableView的头部或者尾部添加view,footerView宽度是不用设置的 xxxView.bounds = CGRectMake(0,0,0,height); self.tableView.tableFooterView =xxxView; self.tableView.tableHeaderView =xxxView; UIButton *bt = (UIButton*)[self.contentView viewWithTag:i+100]; 增加tableview滚动区域 self.tableView.contentInset = UIEdgeInsetsMake(0, 0, xx, 0); UITableViewCell //创建UITableViewCell UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:nil]; [cell.textLabel setBackgroundColor:[UIColor clearColor]];// 清空标签背景颜色 cell.backgroundView =xx; //设置背景图片 cell.backgroundVColor =xx; cell.selectedBackgroundView = selectedBgView; //设置选中时的背景颜色 cell.accessoryView = xxxView; //设置右边视图 [cell setAccessoryType:UITableViewCellAccessoryNone]; //设置右侧箭头 [self setSelectionStyle:UITableViewCellSelectionStyleNone]; //选中样式 cell.selectionStyle = UITableViewCellSelectionStyleBlue; //设置cell的高度 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath contentView下默认有3个子视图,其中的2个是UILabel,通过textLabel和detailTextLabel属性访问,第3个是UIImageView,通过imageView属性访问. UITableViewCellStyleDefault, UITableViewCellStyleValue1, UITableViewCellStyleValue2, UITableViewCellStyleSubtitle #pragma mark - 重新调整UITalbleViewCell中的控件布局 - (void)layoutSubviews{ [super layoutSubviews]; … } cell 里面还有一个contentView UITableViewCell表格优化 UITableViewCell对象的重用原理: 重用原理:当滚动列表时,部分UITableViewCell会移出窗口,UITableView会将窗口外的UITableViewCell放入一个对象池中,等待重用。当UITableView要求dataSource返回UITableViewCell时,dataSource会先查看这个对象池,如果池中有未使用的UITableViewCell,dataSource会用新的数据配置这个UITableViewCell,然后返回给UITableView,重新显示到窗口中,从而避免创建新对象 还有一个非常重要的问题:有时候需要自定义UITableViewCell(用一个子类继承UITableViewCell),而且每一行用的不一定是同一种UITableViewCell(如短信聊天布局),所以一个UITableView可能拥有不同类型的UITableViewCell,对象池中也会有很多不同类型的UITableViewCell,时可能会得到错误类型的UITableViewCell那么UITableView在重用UITableViewCell。解决方案:UITableViewCell有个NSString *reuseIdentifier属性,可以在初始化UITableViewCell的时候传入一个特定的字符串标识来设置reuseIdentifier(一般用UITableViewCell的类名)。当UITableView要求dataSource返回UITableViewCell时,先通过一个字符串标识到对象池中查找对应类型的UITableViewCell对象,如果有,就重用,如果没有,就传入这个字符串标识来初始化一个UITableViewCell对象 /** 单元格优化 1. 标示符统一,使用static的目的可以保证表格标示符永远只有一个 2. 首先在缓冲池中找名为"myCell"的单元格对象 3. 如果没有找到,实例化一个新的cell **/ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ static NSString *cellIdentifier = @"myCell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; //使用这种方法不用判断下面的cell UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath]; if (cell == nil) { cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; } return cell; } 表格的编辑模式 删除、插入 - (void)setEditing:(BOOL)editing animated:(BOOL)animated; 开启表格编辑状态 - (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{ 返回表格编辑编辑样式。不实现默认都是删除 return editingStyle : UITableViewCellEditingStyleDelete, UITableViewCellEditingStyleInsert } - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{ //根据editingStyle处理是删除还是添加操作 完成删除、插入操作刷新表格 - (void)insertRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation; -(void)deleteRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation; } 移动 - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath sourceIndexPath 移动的行 destinationIndexPath 目标的行 自定义表格行UITableViewCell storyboard方式创建: 直接拖到UITableView里面设置UITableViewCell 注意: 1.通过XIB或者Storyboard自定义单元格时,在xib和Storyboard里面需要指定单元格的可重用标示符Identifier 2.注意表格的优化中的差别 在Storyboard中两者等效 xxCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; xxCell *cell1 = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; 在xib文件中有差别: 第一种情况,只能在iOS 6以上使用,如果在viewDidLoad注册了nib文件,并且指定了“单元格”的可重用标示符,那么 dequeueReusableCellWithIdentifier: dequeueReusableCellWithIdentifier:forIndexPath: 方法是等效的。如果在viewDidLoad中注册了nib文件,表格缓冲池中的管理,有系统接管! 第二种情况,是在iOS 4以上均可以使用,如果没有在viewDidLoad注册nib文件,那么,只能使用 dequeueReusableCellWithIdentifier:并且需要判断cell没有被实例化,并做相应的处理 在代码创建中差别: 用代码创建cell中的处理和nib一样,注册了cell就有系统接管并且可以用带forIndexPath的方法,没有注册就要自己去实例化cell,不能用带forIndexPath的方法 [tableView registerClass:XxxCell class] forCellReuseIdentifier:@"xxCell"]; xib方式创建: //注册Identifier - (void)viewDidLoad{ [super viewDidLoad]; /** 注意:以下几句注册XIB的代码,一定要在viewDidLoad中! 注册XIB文件,获得根视图,并且转换成TableView,为tableView注册xib Identifier名要在xib文件中定义,并且保持一致 **/ UINib *nib = [UINib nibWithNibName:@"BookCell" bundle:[NSBundle mainBundle]]; UITableView *tableView = (UITableView *)self.view; [tableView registerNib:nib forCellReuseIdentifier:@"bookCell"]; } //没有注册Identifier只能使用下面方法 static NSString *CellIdentifier = @"bookCell"; BookCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[BookCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; NSBundle *bundle = [NSBundle mainBundle]; NSArray *array = [bundle loadNibNamed:@"BookCell" owner:nil options:nil]; cell = [array lastObject]; } 代码方式创建: 1. 建立UITableViewCell的类,继承UITableViewCell 2. 往cell里面加入view的时候注意点: //新建的组件放入contentView中 [self.contentView addSubview:xxView]; //设置图片拉伸属性stretch UIImage *normalImage = [UIImage imageNamed:@"xx.png"]; normalImage = [normalImage stretchableImageWithLeftCapWidth: normalImage.size.width / 2 topCapHeight:normalImage.size.height / 2]; //在tableView里面viewDiDLoad里面要注册cell类 [tableView registerClass:XxxCell class] forCellReuseIdentifier:@"xxCell"]; 自定义表格中Header //自定义表格在这个方法中定义 -(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section -(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section 五.UISegment属性 1.segmentedControlStyle 设置segment的显示样式。 typedef NS_ENUM(NSInteger, UISegmentedControlStyle) { UISegmentedControlStylePlain, // large plain 系统默认平板样式 segmentedControl.segmentedControlStyle = UISegmentedControlStylePlain; UISegmentedControlStyleBordered, // large bordered 黑边样式 segmentedControl.segmentedControlStyle = UISegmentedControlStyleBordered; UISegmentedControlStyleBar, // small button/nav bar style. Tintable 条状样式 segmentedControl.segmentedControlStyle = UISegmentedControlStyleBar; UISegmentedControlStyleBezeled, // DEPRECATED. Do not use this style. 这个类型不要使用,用了会报错喔。 }; 2.tintColor 渐变颜色 Default tintColor is nil. Only used if style is UISegmentedControlStyleBar 默认空,只有使用UISegmentedControlStyleBar,才能设置渐变颜色。 segmentedControl.segmentedControlStyle = UISegmentedControlStyleBar; segmentedControl.tintColor = [UIColor redColor]; 效果: 3.momentary 设置在点击后是否恢复原样 默认为NO segmentedControl.momentary = No; 点击之后效果: segmentedControl.momentary = YES; 点击之后效果: 4. numberOfSegments(只读) 获取总选项数segmentedControl.numberOfSegments 5. selectedSegmentIndex 用来设置选中项或者返回选中项。 segmentedControl.selectedSegmentIndex = 2;//设置默认选择项索引 segmentedControl.selectedSegmentIndex // 获取选中项 6.- (void)setTitle:(NSString *)title forSegmentAtIndex:(NSUInteger)segment; [segmentedControl setTitle:@"two" forSegmentAtIndex:1];//设置指定索引的题目 效果: 7. - (void)setImage:(UIImage *)image forSegmentAtIndex:(NSUInteger)segment; [segmentedControl setImage:[UIImage imageNamed:@"lan.png"] forSegmentAtIndex:3];//设置指定索引的图片 8.-(void)insertSegmentWithTitle:(NSString*)title atIndex:(NSUInteger)segment animated:(BOOL)animated; [segmentedControl insertSegmentWithTitle:@"add" atIndex:3 animated:NO];//在指定索引插入一个选项并设置题目 效果: 9.-(void)insertSegmentWithImage:(UIImage *)image atIndex:(NSUInteger)segment animated:(BOOL)animated; [segmentedControl insertSegmentWithImage:[UIImage imageNamed:@"mei.png"] atIndex:2 animated:NO];//在指定索引插入一个选项并设置图片 10.- (void)removeSegmentAtIndex:(NSUInteger)segment animated:(BOOL)animated; [segmentedControl removeSegmentAtIndex:0 animated:NO];//移除指定索引的选项 效果: 11. - (void)removeAllSegments; //移除所有选项 //[segmentedControl removeAllSegments]; 12. - (void)setWidth:(CGFloat)width forSegmentAtIndex:(NSUInteger)segment; // set to 0.0 width to autosize. default is 0.0 选项卡的宽度默认为0,此方法能够设置选项卡宽度。 [segmentedControl setWidth:70.0 forSegmentAtIndex:2];//设置指定索引选项的宽度 效果: 13. - (void)setContentOffset:(CGSize)offset forSegmentAtIndex:(NSUInteger)segment; // adjust offset of image or text inside the segment. default is (0,0) [segmentedControl setContentOffset:CGSizeMake(10,0) forSegmentAtIndex:1]; 设置选项卡内部文字或者图片与默认位置的偏移量,默认位置在选项卡的中心。 效果: 14. - (void)setEnabled:(BOOL)enabled forSegmentAtIndex:(NSUInteger)segment; [segmentedControl setEnabled:NO forSegmentAtIndex:4];//设置指定索引选项不可选 15.增加事件响应机制 监听的是这个事件:UIControlEventValueChanged,值改变事件 [segmentedControl addTarget:self action:@selector(itemClick) forControlEvents:UIControlEventValueChanged]; 六.UIButton属性 1.UIButton状态: UIControlStateNormal // 正常状态 UIControlStateHighlighted // 高亮状态 UIControlStateDisabled // 禁用状态 UIControlStateSelected // 选中状态 UIControlStateApplication // UIControlStateReserved // 保留状态 2.Uibutton类型: UIButtonTypeCustom //自定义类型 添加图片: 灰色背景颜色: UIButtonTypeRoundedRect //圆角类型 UIButtonTypeDetailDisclosure //细节展示按钮 UIButtonTypeInfoLight //浅色背景的信息按钮 UIButtonTypeInfoDark //暗色背景的信息按钮 UIButtonTypeContactAdd // 添加按钮 3.UIButton常用属性 给按钮设置文字时,苹果文档说明,不能使用label对象设置文字的颜色或者阴影颜色,相反必须使用setTitleColor:forState: and setTitleShadowColor:forState:这两个方法才能修改这些值。 设置按钮中其他属性依次类推。。。。 //设置对应状态的标题内容default is nil. title is assumed to be single line - (void)setTitle:(NSString *)title forState:(UIControlState)state; //设置对应状态的标题颜色 - (void)setTitleColor:(UIColor *)color forState:(UIControlState)state; //设置对应状态的标题阴影颜色 - (void)setTitleShadowColor:(UIColor *)color forState:(UIControlState)state; //设置对应状态的按钮的图片 - (void)setImage:(UIImage *)image forState:(UIControlState)state; //设置对应状态的按钮背景图片 - (void)setBackgroundImage:(UIImage *)image forState:(UIControlState)state; 添加事件 - (void)addTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents; 这些事件都是基于触摸、基于值、基于编辑。有如下事件会触发。 在点击按钮是按钮是凹下去,然后弹起才触发起事件,按钮的状态有: 1. UIControlEventTouchDown // 按下 2. 3. UIControlEventTouchDownRepeat 多次按下 4. UIControlEventTouchUpInside // 在按钮及其一定外围内松开 5. 6. UIControlEventTouchUpOutside // 按钮外面松开 4.adjustsImageWhenDisabled 当按钮禁用的情况下,图像的颜色会被画深一点,默认为YES。 5.adjustsImageWhenHighlighted 当按钮高亮的情况下,图像的颜色会被画深一点,默认为YES。 6.showsTouchWhenHighlighted button.showsTouchWhenHighlighted=YES;点击时的闪光效果会被前景图片遮住中间部分; 6.contentEdgeInsets 设置按钮的内部内容(包含按钮图片和标题)离按钮边缘上下左右的距离。 7.按钮实例 1.有些时候我们想让UIButton的title居左对齐,我们设置 btn.textLabel.textAlignment = UITextAlignmentLeft 是没有作用的,我们需要设置 btn.contentHorizontalAlignment = UIControlContentHorizonAlignmentLeft; 但是问题又出来,此时文字会紧贴到左边框,我们可以设置 btn.contentEdgeInsets = UIEdgeInsetsMake(0,10, 0, 0); 使文字距离左边框保持10个像素的距离。
收藏
1
sina weixin mail 回到顶部