百思不得姐第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天:文本框占位文字颜色的主要内容,如果未能解决你的问题,请参考以下文章

文本编辑框光标颜色和占位文字颜色自定义

改变设置文本框占位文字和图片

ppt中有链接文字怎么才能不改颜色?

调整TextField占位文字颜色

如何对占位符应用不同的颜色并输入文本框值?

自定义文本框占位颜色和runtime