百思不得姐第4天:文本框占位文字颜色
Posted Hello_IOS
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了百思不得姐第4天:文本框占位文字颜色相关的知识,希望对你有一定的参考价值。
一:设置登录界面和注册界面的切换
#import "CQLoginViewController.h" #import "CQCustomTextField.h" @interface CQLoginViewController () @property (weak, nonatomic) IBOutlet NSLayoutConstraint *centerTopConstraints; @property (weak, nonatomic) IBOutlet UIButton *loginbtn; @property (weak, nonatomic) IBOutlet CQCustomTextField *loginScreenField; @property (weak, nonatomic) IBOutlet CQCustomTextField *loginPhoneField; @property (weak, nonatomic) IBOutlet CQCustomTextField *registScreenField; @property (weak, nonatomic) IBOutlet CQCustomTextField *registPhoneField; @end @implementation CQLoginViewController - (void)viewDidLoad { [super viewDidLoad]; //1:设置登陆注册按钮的圆角效果 /** 1: [self.loginbtn setValue:@YES forKeyPath:@"layer.masksToBounds"]; [self.loginbtn setValue:@6 forKeyPath:@"layer.cornerRadius"]; 2: self.loginbtn.layer.masksToBounds = YES; self.loginbtn.layer.cornerRadius = 6; 3:可以在xib中设置其圆角效果:设置keypath路径即可 */ } #pragma mark -- 注册按钮的点击事件 - (IBAction)registBtn:(UIButton *)sender { //根据点击的不同的按钮来显示登陆或是注册的文本框 /** * 1:可以根据btn.currentTile来判断 2:根据按钮的选中状态来判断 3:根据约束值来判断 */ //1:先退去键盘 [self.view endEditing:YES]; //2:偏移view sender.selected = !sender.isSelected; self.centerTopConstraints.constant = sender.isSelected ? (- self.view.CQ_Width) : 0; [UIView animateWithDuration:0.5 animations:^{ // 强制刷新 : 让最新设置的约束值马上应用到UI控件上 // 会刷新到self.view内部的所有子控件 [self.view layoutIfNeeded]; }]; } #pragma mark -- 取消按钮点击事件 - (IBAction)cancleBtn:(UIButton *)sender { [self dismissViewControllerAnimated:YES completion:nil]; } #pragma mark -- 修改状态栏的样式 - (UIStatusBarStyle)preferredStatusBarStyle { return UIStatusBarStyleLightContent; } #pragma mark -- 点击空白处退去键盘 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { [self.view endEditing:YES]; } @end
总结:1:设置登陆按钮的圆角效果:1:直接设置按钮的layer,若是表格视图,不建议通过layer设置圆角效果,会很耗性能,最好是通过绘图的方式设置圆角效果 2:利用kvc也可以设置圆角效果,kvc一般都是为属性赋值,setValue forKey直接为属性赋值,setValue forKeyPath为属性的路径赋值,属性的属性:
[self.loginbtn setValue:@YES forKeyPath:@"layer.masksToBounds"]; [self.loginbtn setValue:@6 forKeyPath:@"layer.cornerRadius"];
3:可以在xib中设置其圆角效果:设置keypath路径即可
2:一个按钮的切换:1:sender.selected = !sender.isSelected; 2:三个按钮的切换:设置currentBtn,按钮的三部曲
3:在xib中登陆界面,删除左侧的间距约束,拖线左侧约束到控制器,根据按钮的状态设置左侧的约束值。再在UIView的动画里强制刷新UI:
[UIView animateWithDuration:0.5 animations:^{
// 强制刷新 : 让最新设置的约束值马上应用到UI控件上
// 会刷新到self.view内部的所有子控件,立即调用layoutsubview,刷新UI视图
[self.view layoutIfNeeded];
}];
4:设置状态栏的样式或是显示隐藏:就在控制器内设置:
- (UIStatusBarStyle)preferredStatusBarStyle {
return UIStatusBarStyleLightContent;
}
二:封装占位文字
#import <UIKit/UIKit.h> @interface UITextField (XMGExtension) /** 占位文字颜色 */ @property (nonatomic, strong) UIColor *placeholderColor; @end
#import "UITextField+XMGExtension.h" static NSString * const XMGPlaceholderColorKey = @"placeholderLabel.textColor"; @implementation UITextField (XMGExtension) - (void)setPlaceholderColor:(UIColor *)placeholderColor { // 提前设置占位文字, 目的 : 让它提前创建placeholderLabel NSString *oldPlaceholder = self.placeholder; self.placeholder = @" "; self.placeholder = oldPlaceholder; // 恢复到默认的占位文字颜色 if (placeholderColor == nil) { placeholderColor = [UIColor colorWithRed:0 green:0 blue:0.0980392 alpha:0.22]; } // 设置占位文字颜色 [self setValue:placeholderColor forKeyPath:XMGPlaceholderColorKey]; } //- (void)setPlaceholderColor:(UIColor *)placeholderColor //{ // // 提前设置占位文字, 目的 : 让它提前创建placeholderLabel // if (self.placeholder.length == 0) { // self.placeholder = @" "; // } // // [self setValue:placeholderColor forKeyPath:XMGPlaceholderColorKey]; //} - (UIColor *)placeholderColor { return [self valueForKeyPath:XMGPlaceholderColorKey]; } @end
总结:1:在分类中不能为类扩充属性,在分类中以属性定义变量,此时不会自动生成带下划线的成员变量,需要自己手动去实现set和get方法,若想拥有带下划线的成员变量,则可以static定义全局变量,在get方法中可以返回。
2:当外界传进来参数的时候,严谨一些最好要先判断外界传进来的值是否为空,为空return返回或是设置默认值,不为空可以利用kvc为属性赋值,在get方法中,再利用kvc valueForKeyPath 取出值并返回
#import "CQCustomTextField.h" #import <objc/runtime.h> @implementation CQCustomTextField /** * 1:从xib中加载完成后会调用,可以在此方法中设置一些一次性代码,类似于init方法来设置一次性代码 2:注意的是当执行完此方法后,子控件的数组个数为0 */ - (void)awakeFromNib { //1:改变光标的颜色 self.tintColor = [UIColor whiteColor]; self.textColor = [UIColor whiteColor]; //2:改变占位文字的默认颜色 self.CQ_placeHolderColor = [UIColor lightGrayColor]; } /** * * * @return <#return value description#> */ - (BOOL)becomeFirstResponder { self.CQ_placeHolderColor = [UIColor whiteColor]; return [super becomeFirstResponder]; } - (BOOL)resignFirstResponder { self.CQ_placeHolderColor = [UIColor lightGrayColor]; return [super resignFirstResponder]; } /** * 1:可以改变Placeholder的颜色和字体大小,和内容 2:在textField要显示的时候调用 - (void)drawPlaceholderInRect:(CGRect)rect { [@"123" drawInRect:CGRectMake(5, 10, 40, self.CQ_Height - 20) withAttributes:@{NSFontAttributeName : Font(13),NSForegroundColorAttributeName : [UIColor whiteColor]}]; } */ /** * 1:此方法是改变占位文字的颜色:遍历子控件,父类的指针指向子类,找到关联的对象设置属性 2:但是在xib中的awakeFromeNib中子控件数组为0,所以无法设置默认的placeholder的颜色 - (void)layoutSubviews { [super layoutSubviews]; for (UIView *view in self.subviews) { if (![view isKindOfClass:NSClassFromString(@"UITextFieldLabel")]) continue; UILabel *lable = (UILabel*)view; lable.textColor = [UIColor redColor]; } } */ /** * runtime:找到某个类的所有下划线的成员变量,包括类私有的不公开的,利用kvc,valueforkeypath,将其定义的私有属性取出,并修改其行为 unsigned int count;//<#unsigned int *outCount#>:参数需要传入一个指针 Ivar *ivarList = class_copyIvarList([UITextField class], &count); for (int i = 0; i < count ; i++) { Ivar var = ivarList [i]; CQLog(@"----------------------------%s", ivar_getName(var)); } free(ivarList); */ @end
总结:1:自定义UITextField类与xib中的文本框相关联,在xib中,关联自定义的类UITextField,在自定义类UITextField实现awakfromNib: 1:awakfromNib:从xib中加载完成后会调用,可以在此方法中设置一些一次性代码,类似于init方法来设置一次性代码 2:注意的是当执行完此方法后,子控件的数组个数为0。在此方法内设置光标的颜色和文字颜色占位文字默认颜色: self.tintColor = [UIColor whiteColor]; self.textColor = [UIColor whiteColor];self.CQ_placeHolderColor = [UIColor lightGrayColor];
以上是关于百思不得姐第4天:文本框占位文字颜色的主要内容,如果未能解决你的问题,请参考以下文章