项目实战No2 登陆注册
来源:互联网 发布:苏州俊知地产有限公司 编辑:程序博客网 时间:2024/04/29 19:45
一 导航栏返回键统一处理
- 自定义NavigationController,重写push方法
/** * 拦截所有push进来的子控制器 * @param viewController 每一次push进来的子控制器 */- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated{// if (不是第一个push进来的子控制器) { if (self.childViewControllers.count >= 1) { // 左上角的返回 UIButton *backButton = [UIButton buttonWithType:UIButtonTypeCustom]; [backButton setTitle:@"返回" forState:UIControlStateNormal]; [backButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; [backButton setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted]; [backButton setImage:[UIImage imageNamed:@"navigationButtonReturn"] forState:UIControlStateNormal]; [backButton setImage:[UIImage imageNamed:@"navigationButtonReturnClick"] forState:UIControlStateHighlighted]; [backButton sizeToFit]; [backButton addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside]; backButton.contentEdgeInsets = UIEdgeInsetsMake(0, -20, 0, 0); viewController.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButton]; viewController.hidesBottomBarWhenPushed = YES; // 隐藏底部的工具条 } // super的push方法一定要写到最后面 // 一旦调用super的pushViewController方法,就会创建子控制器viewController的view // 也就会调用viewController的viewDidLoad方法 [super pushViewController:viewController animated:animated];}
二 手势滑动
- 禁止调用最前面控制器的手势
#pragma mark - <UIGestureRecognizerDelegate>/** * 每当用户触发[返回手势]时都会调用一次这个方法 * 返回值:返回YES,手势有效; 返回NO,手势失效 */- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{ // 如果当前显示的是第一个子控制器,就应该禁止掉[返回手势]// if (self.childViewControllers.count == 1) return NO;// return YES; return self.childViewControllers.count > 1; //简化写法}
三 颜色设置
- 颜色须知
1> 每一种颜色都是由N个颜色通道组成
2> 常见的颜色通道- A:alpha 透明度
- R:red 红色
- G:green 绿色
- B:blue 蓝色
3> 常见颜色 - 白色:全部通道满值
- 黑色:全部通道都是0(透明度除外)
- 灰色:RGB通道的值一样
一、32bit颜色
1> 颜色组成
1) 由ARGB四个颜色通道组成
2) 每一个颜色通道都占据8bit
3) 每一个颜色通道的取值范围是[0, 255] [0x00, 0xff] [0b00000000, 0b11111111]
2> 颜色的表示格式
1) 16进制格式(HEX格式)
* 绿色 #ff00ff00
* 黄色 #ffffff00
* 白色 #ffffffff
* 黑色 #ff000000
2) ARGB格式
* 绿色 255,0,255,0
* 黄色 255,255,255,0
* 白色 255,255,255,255
* 黑色 255,0,0,0
二、24bit颜色
1> 颜色组成
1) 由RGB三个颜色通道组成
2) 每一个颜色通道都占据8bit
3) 每一个颜色通道的取值范围是[0, 255] [0x00, 0xff] [0b00000000, 0b11111111]
2> 颜色的表示格式
1) 16进制格式(HEX格式)
* 绿色 #00ff00
* 黄色 #ffff00
* 白色 #ffffff
* 黑色 #000000
2) RGB格式
* 绿色 0,255,0
* 黄色 255,255,0
* 白色 255,255,255
* 黑色 0,0,0
三、12bit颜色
1> 颜色组成
1) 由RGB三个颜色通道组成
2) 每一个颜色通道都占据4bit
3) 每一个颜色通道的取值范围是[0, 15] [0x0, 0xf] [0b0000, 0b1111]
2> 颜色的表示格式
1) 16进制格式(HEX格式)
* 绿色 #00ff0
* 黄色 #ff0
* 白色 #fff
* 黑色 #000
2) RGB格式
* 绿色 0,15,0
* 黄色 15,15,0
* 白色 15,15,15
* 黑色 0,0,0
四 我的关注页面
xib连线
Label文字换行居中
- 设置Lines = 0
- 按住option+return实现文字换行
- 设置Alignment居中
- Button注意点
- button默认样式是System,这个样式下高亮状态颜色会变浅
- 需要设置样式为Custom
五 登陆注册功能
图片设置
- 对比设置image与设置backgroundimage
- 设置image效果:图片比较小,点击面积比较大
- 对比设置image与设置backgroundimage
图片拉伸(View→Mode)
- 默认为Scale To Fill
- 只要不带Fill的模式都不会拉伸,调至Center
- 调整快速登录图片标题位置
- 新建分类
- pch文件全局引用
- 重写layoutSubviews
Text Field设置
- 去除边框
- BoderStyle选择虚线边框
- Text Field后面一键删除功能
- Cleear Button选择Is always visible(永远显示)
- 帐号选择键盘
- Keyboard Type→Phone Pad
- 密码选择键盘
- Keyboard Type→Default(默认)
- 暗文模式:勾选Secure Text Entry
- 去除边框
登陆按钮做圆角样式
方法一
- (void)viewDidLoad {[super viewDidLoad];self.loginButton.layer.cornerRadius = 5;// self.loginButton.layer.masksToBounds = YES;self.loginButton.clipsToBounds = YES; // 另一种写法}
方法二
[self.loginButton setValue:@5 forKeyPath:@"layer.cornerRadius"];[self.loginButton setValue:@YES forKeyPath:@"layer.masksToBounds"];
方法三
- 凡是kvc能解决的都可以通过这设置
点击控制器view退出键盘
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{[self.view endEditing:YES];}
- 修改状态栏为白色
- (UIStatusBarStyle)preferredStatusBarStyle { return UIStatusBarStyleLightContent; }
六 占位文字
- 自定义TextField
- (void)awakeFromNib{ // 文本框的光标颜色 self.tintColor = [UIColor whiteColor]; // 文字颜色 self.textColor = [UIColor whiteColor]; // 设置带有属性的占位文字(富文本) self.attributedPlaceholder = [[NSAttributedString alloc] initWithString:self.placeholder attributes:@{NSForegroundColorAttributeName : [UIColor grayColor]}];}
富文本用法
不可变的属性文字
NSMutableDictionary *attrs = [NSMutableDictionary dictionary];attrs[NSForegroundColorAttributeName] = [UIColor grayColor];attrs[NSUnderlineStyleAttributeName] = @1;attrs[NSUnderlineColorAttributeName] = [UIColor redColor];self.attributedPlaceholder = [[NSAttributedString alloc] initWithString:self.placeholder attributes:attrs];
可变的属性文字
NSMutableAttributedString *string = [[NSMutableAttributedString alloc] initWithString:self.placeholder];[string addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:NSMakeRange(0, 1)];[string addAttribute:NSForegroundColorAttributeName value:[UIColor greenColor] range:NSMakeRange(1, 1)];[string addAttribute:NSFontAttributeName value:[UIFont boldSystemFontOfSize:30] range:NSMakeRange(1, 1)];self.attributedPlaceholder = string;
图文混排
NSMutableAttributedString *string = [[NSMutableAttributedString alloc] init];// 第一段:placeholderNSAttributedString *substring1 = [[NSAttributedString alloc] initWithString:self.placeholder];[string appendAttributedString:substring1];// 第二段:图片NSTextAttachment *attachment = [[NSTextAttachment alloc] init];attachment.image = [UIImage imageNamed:@"login_close_icon"];attachment.bounds = CGRectMake(0, 0, 16, 16);NSAttributedString *subtring2 = [NSAttributedString attributedStringWithAttachment:attachment];[string appendAttributedString:subtring2];// 第三段:哈哈NSAttributedString *substring3 = [[NSAttributedString alloc] initWithString:@"哈哈"];[string appendAttributedString:substring3];self.attributedPlaceholder = string;
重写占位字符方法:
方法一
- (void)drawPlaceholderInRect:(CGRect)rect{// 占位文字画在哪个矩形框里面CGRect placeholderRect = self.bounds;placeholderRect.origin.y = (self.height - self.font.lineHeight) * 0.5;// 文字属性NSMutableDictionary *attrs = [NSMutableDictionary dictionary];attrs[NSForegroundColorAttributeName] = [UIColor redColor];attrs[NSFontAttributeName] = self.font;[self.placeholder drawInRect:placeholderRect withAttributes:attrs];}
方法二
// 占位文字画在哪个位置CGPoint point;point.x = 0;point.y = (self.height - self.font.lineHeight) * 0.5;// 文字属性NSMutableDictionary *attrs = [NSMutableDictionary dictionary];attrs[NSForegroundColorAttributeName] = [UIColor redColor];attrs[NSFontAttributeName] = self.font;[self.placeholder drawAtPoint:point withAttributes:attrs];
方法三:运行时
什么是运行时(Runtime)?
- 运行时是苹果提供的纯C语言的开发库(运行时是一种非常牛逼、开发中经常用到的底层技术)
运行时的作用?
- 能获得某个类的所有成员变量
- 能获得某个类的所有属性
- 能获得某个类的所有方法
- 交换方法实现
- 能动态添加一个成员变量
- 能动态添加一个属性
- 能动态添加一个方法
- (void)awakeFromNib { // 文本框的光标颜色 self.tintColor = [UIColor whiteColor];// 文字颜色 self.textColor = [UIColor whiteColor]; // UILabel *placeholderLabel = [self valueForKeyPath:@"placeholderLabel"];// placeholderLabel.textColor = [UIColor redColor]; [self setValue:[UIColor grayColor] forKeyPath:@"placeholderLabel.textColor"];// 成员变量的数量unsigned int outCount = 0;// 获得所有的成员变量Ivar *ivars = class_copyIvarList([UITextField class], &outCount);// 遍历所有的成员变量for (int i = 0; i<outCount; i++) { // 取出i位置对应的成员变量 Ivar ivar = ivars[i]; // 获得成员变量的名字 NSLog(@"%s", ivar_getName(ivar));}// 如果函数名中包含了copy\new\retain\create等字眼,那么这个函数返回的数据就需要手动释放free(ivars);}
监听text点击
- 方法1:通过代理
- 自己成为自己代理,这种做法不推荐,因为delegate属性很容易被外界覆盖;
方法2:通过addTarget,方法最简单
// 通过addTarget监听文本框的开始和结束编辑 [self addTarget:self action:@selector(beginEditing) forControlEvents:UIControlEventEditingDidBegin]; [self addTarget:self action:@selector(endEditing) forControlEvents:UIControlEventEditingDidEnd];
方法3 :通知
- (void)awakeFromNib {// 通过通知监听文本框的开始和结束编辑[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(beginEditing) name:UITextFieldTextDidBeginEditingNotification object:self];[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(endEditing) name:UITextFieldTextDidEndEditingNotification object:self];}// 移除通知- (void)dealloc{[[NSNotificationCenter defaultCenter] removeObserver:self];}- (void)beginEditing{ [self setValue:[UIColor whiteColor] forKeyPath:@"placeholderLabel.textColor"];}- (void)endEditing{[self setValue:[UIColor grayColor] forKeyPath:@"placeholderLabel.textColor"];}
- 方法4:聚焦失焦
/*** 文本框聚焦时调用(弹出当前文本框对应的键盘时调用)*/- (BOOL)becomeFirstResponder{[self setValue:[UIColor whiteColor] forKeyPath:@"placeholderLabel.textColor";return [super becomeFirstResponder];}/*** 文本框失去焦点时调用(隐藏当前文本框对应的键盘时调用)*/- (BOOL)resignFirstResponder{[self setValue:[UIColor grayColor] forKeyPath:@"placeholderLabel.textColor";return [super resignFirstResponder];}
- 方法1:通过代理
七 注册页面
登陆和注册页面类似,2个可以互相切换
- 注意点:文字宽度不一样,切换时出现…
- 设置宽度约束,Button→Control→ Alignment设右对齐
- 另一方法设置Selected文字名称
- 注意点:Button→Type→system下,当Selected=YES背景会渲染蓝色;
- 换成Button→Type→Custom
- (IBAction)loginOrRegister:(UIButton *)button {// 修改约束if (self.leftSpace.constant == 0) { self.leftSpace.constant = - self.view.width; button.selected = YES;// [button setTitle:@"已有帐号?" forState:UIControlStateNormal];} else { self.leftSpace.constant = 0; button.selected = NO;// [button setTitle:@"注册帐号" forState:UIControlStateNormal];}[UIView animateWithDuration:0.25 animations:^{ [self.view layoutIfNeeded];}];}
- 注意点:文字宽度不一样,切换时出现…
- 项目实战No2 登陆注册
- 项目开发登陆注册
- 前端实战之登陆注册页
- IOS项目实战-登陆解析
- 关于用户注册、登陆、注销小项目
- (Android实战系统一)对话框实现登陆注册功能
- No2 项目框架搭建
- Android项目实战——注册功能
- 项目实战:Android中登录&注册二三事
- 登陆、注册
- 登陆注册
- 登陆注册
- 登陆注册
- 通用电商项目关于登陆注册自动的实现
- struts2学习笔记之四(注册登陆小项目)
- nodejs之express搭建项目-以注册登陆为例
- unity项目中使用到的登陆注册逻辑备注
- 孙孙啊i之项目实战(六) 第三方登陆
- 手机适配的基础
- Python的Threading模块的Thread对象的join方法
- 树形DP问题
- PagerSlidingTabStrip源码分析及扩展
- 设计模式-结构型之享元模式
- 项目实战No2 登陆注册
- uva 810 - A Dicey Problem(隐式图)
- 简述利用list实现简易电话本管理系统
- 关于原生native方法找不到实现问题
- EL
- 比较完整的c3p0配置
- POJ 3237 树链剖分学习(&&树链剖分小结)
- Android UI之Gallery和ImageSwitcher
- uva 816 - Abbott's Revenge(bfs)