QQ登陆页面实现
最終效果圖如下:
注意事項(xiàng):<喎�"http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vc3Ryb25nPjwvcD4KPHA+PHN0cm9uZz7K5Mjrv/K1xHJldHVybiBLZXk8L3N0cm9uZz48L3A+CjxwPjxzdHJvbmc+TWFpbi5zdG9yeWJvYXJk1tDOqiBMb2dpbkNvbnRyb2xsZXIgyejWw9K7uPZzdG9yeWJvYXJkSUQsPC9zdHJvbmc+PC9wPgo8cD48c3Ryb25nPtLUseO/ydLU1Nq0+sLr1tDNqLn9U3Rvcnlib2FyZLbUz/PKtcD9LLS0vahNYWluLnN0b3J5Ym9hcmTA78PmtcS/2NbGxvc8L3N0cm9uZz48L3A+CjxwPjxzdHJvbmc+PGJyPgo8L3N0cm9uZz48L3A+CjxwPjxzdHJvbmc+PGJyPgo8L3N0cm9uZz48L3A+CjxwPjxpbWcgc3JjPQ=="http://www.2cto.com/uploadfile/Collfiles/20140902/20140902085743107.png" alt="\">
仿QQ窗口抖動(dòng)
dispach_after模擬延時(shí)
輸入框的return Key的不同處理方式
Login控制器代碼
?| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 | // //? LoginController.m //? 28_QQ空間 // //? Created by beyond on 14-9-1. //? Copyright (c) 2014年 com.beyond. All rights reserved. //? Main.storyboard中初始化時(shí)的控制器,登錄控制器 驗(yàn)證成功后,跳轉(zhuǎn)至主控制器 #import "LoginController.h" // 驗(yàn)證成功后,跳轉(zhuǎn)至主控制器 #import "BeyondViewController.h" @interface LoginController () <uitextfielddelegate> #pragma mark - 拖線 屬性 // 登錄框整體 @property (weak, nonatomic) IBOutlet UIView *loginContentView; // 帳號(hào) @property (weak, nonatomic) IBOutlet UITextField *usernameField; // 密碼 @property (weak, nonatomic) IBOutlet UITextField *passwordField; // 登錄按鈕 @property (weak, nonatomic) IBOutlet UIButton *loginBtn; // 記住密碼btn @property (weak, nonatomic) IBOutlet UIButton *rememberPwdBtn; // 自動(dòng)登錄btn @property (weak, nonatomic) IBOutlet UIButton *autoLoginBtn; // 加載中... @property (weak, nonatomic) IBOutlet UIActivityIndicatorView *activityIndicator; #pragma mark - 拖線 方法 // 登錄按鈕被點(diǎn)擊 - (IBAction)loginBtnClicked; // 點(diǎn)擊了記住密碼 或 自動(dòng)登錄 - (IBAction)checkboxBtnClicked:(UIButton *)sender; @end @implementation LoginController - (void)viewDidLoad { ????[super viewDidLoad]; ????// 1.設(shè)置登陸控制器 的背景色 為全局深黑色 ????self.view.backgroundColor = kGlobalBgColor; ????? ????// 2.設(shè)置登錄按鈕不同狀態(tài)下的背景 ????[self.loginBtn setBtnBgImgForNormal:@"login_button_normal" highlightedName:@"login_button_pressed"]; } // 點(diǎn)擊屏幕空白處,退出鍵盤 - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { ????[self.view endEditing:YES]; } #pragma mark - 拖線方法 // 點(diǎn)擊了記住密碼 或 自動(dòng)登錄 - (IBAction)checkboxBtnClicked:(UIButton *)sender { ????// 設(shè)置勾選 或 取消勾選 ????sender.selected = ! sender.isSelected; ????// 重要~~~ ????if (sender == self.rememberPwdBtn && !sender.isSelected) { ????????// 取消了“記住密碼”,這時(shí)候 就可以同時(shí)取消 自動(dòng)登錄了,因?yàn)橛脩舨幌胗涀∶艽a,自然就無法實(shí)現(xiàn) 自動(dòng)登錄功能 ????????self.autoLoginBtn.selected = NO; ????} else if (sender == self.autoLoginBtn && sender.isSelected) { ????????// 當(dāng)用戶 選中了“自動(dòng)登錄”,那么表示他想自動(dòng)登錄,那么可以同時(shí)把記住密碼勾選上 ????????self.rememberPwdBtn.selected = YES; ????} } // 點(diǎn)擊登錄按鈕 - (IBAction)loginBtnClicked { ????// 1.驗(yàn)證帳號(hào) ????NSString *account = self.usernameField.text; ????if (account.length == 0) { ????????[self showError:@"請(qǐng)輸入帳號(hào)"]; ????????return; ????} ????? ????// 2.驗(yàn)證密碼 ????NSString *password = self.passwordField.text; ????if (password.length == 0) { ????????[self showError:@"請(qǐng)輸入密碼"]; ????????return; ????} ????? ????// 3.發(fā)送請(qǐng)求 ????self.view.userInteractionEnabled = NO; ????[self.activityIndicator startAnimating]; ????? ????// 模擬延時(shí) ????CGFloat delay = 2.0; ????dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delay * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ ????????// 4.登錄完畢(請(qǐng)求完畢) ????????[self.activityIndicator stopAnimating]; ????????self.view.userInteractionEnabled = YES; ????????? ????????// 5.賬號(hào)密碼同時(shí)為123才是正確 ????????if (![account isEqualToString:@"123"]) { ????????????[self showError:@"帳號(hào)或密碼錯(cuò)誤"]; ????????????return; ????????} ????????if (![password isEqualToString:@"123"]) { ????????????[self showError:@"帳號(hào)或密碼錯(cuò)誤"]; ????????????return; ????????} ????????? ????????// 6.登錄成功? 跳轉(zhuǎn)到主頁 ????????self.view.window.rootViewController = [[BeyondViewController alloc] init]; ????}); } #pragma mark - 自定義方法 // 提示錯(cuò)誤信息 - (void)showError:(NSString *)errorMsg { ????// 1.彈框提醒 ????UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"登錄失敗" message:errorMsg delegate:nil cancelButtonTitle:@"確定" otherButtonTitles:nil, nil]; ????[alert show]; ????? ????// 2.仿QQ窗口抖動(dòng) ????// 核心動(dòng)畫之 關(guān)鍵幀動(dòng)畫 ????CAKeyframeAnimation *shakeAnim = [CAKeyframeAnimation animation]; ????// 哪一個(gè)成員屬性 需要?jiǎng)赢?答:x ????shakeAnim.keyPath = @"transform.translation.x"; ????shakeAnim.duration = 0.15; ????CGFloat delta = 10; ????// 數(shù)組,指定每一幀時(shí)的x值 ????shakeAnim.values = @[@0, @(-delta), @(delta), @0]; ????shakeAnim.repeatCount = 2; ????// 讓view所在的圖層執(zhí)行 關(guān)鍵幀動(dòng)畫 ????[self.loginContentView.layer addAnimation:shakeAnim forKey:nil]; } #pragma mark - UITextField代理方法 // 控制器 鍵盤上returnKey在不同輸入框下的作用,如Next 或 Done - (BOOL)textFieldShouldReturn:(UITextField *)textField { ????if (textField == self.usernameField) { ????????// 帳號(hào)輸入框(Next) ????????[self.passwordField becomeFirstResponder]; ????} else { ????????// 密碼框(Done),調(diào)用自定義方法,執(zhí)行登錄 ????????[self loginBtnClicked]; ????} ????return YES; } @end </uitextfielddelegate> |
退出,并且回到Main.storyboard里面的初始的登錄控制器
原地址:http://www.2cto.com/kf/201409/330294.html
總結(jié)
- 上一篇: 模式识别技术,目前主要应用于哪几方面?
- 下一篇: Echarts 做的温度计