iOS_28仿QQ空间登录与退出

日期:2019-11-30编辑作者:最快开奖计算机

iOS_31_cocos2d_Progress进度条

最终效果图: 图片 1 进度条节点【CCProgressNode】,构造时依赖一个Sprite 【CCProgressNode】添加一个CCActionProgressFromTo动作**图片 2
**也可以在update方法中,更改【CCProgressNode< 喎?" target="_blank" class="keylink">vc3Ryb25nPjxzdHJvbmc+ob+1xHBlcmNlbnRhZ2XK9NDULMq1z9a9+LbIzPXQp7n7PC9zdHJvbmc+PGJyPgo8L3N0cm9uZz4KCjxzdHJvbmc+PHN0cm9uZz6hvkNDUHJvZ3Jlc3NOb2RlPC9zdHJvbmc+PHN0cm9uZz6hvzwvc3Ryb25nPrv5sb7K9NDUo7o8L3N0cm9uZz4KCjxzdHJvbmc+PGltZyBzcmM9"" alt="">
**【CCProgressNode】构造方法: 图片 3 它的类型只有两种: 雷达和条形 图片 4 进度条场景代码**

//
//  ProgressScene.h
//  31_cocos2D入门
//
//  Created by beyond on 14-9-22.
//  Copyright (c) 2014年 com.beyond. All rights reserved.
//

#import "CCScene.h"
#import "cocos2d.h"
#import "cocos2d-ui.h"
@interface ProgressScene : CCScene

+ (instancetype)scene;
- (id)init;
@end




//
//  ProgressScene.m
//  31_cocos2D入门
//
//  Created by beyond on 14-9-22.
//  Copyright (c) 2014年 com.beyond. All rights reserved.
//  演示进度条:雷达或者bar条形

#import "ProgressScene.h"



@interface ProgressScene ()
{
    // 精灵
    CCSprite *_sprite;

    // 相当于一个ProgressView,通过进度的形式,展示一个Sprite,(根据说明可知,其构造方法,需要Sprite)
    CCProgressNode *_progressNode;
}
@end

@implementation ProgressScene

#pragma mark - 生命周期
+ (instancetype)scene
{
 return [[self alloc] init];
}
- (id)init
{

    self = [super init];
    if (!self) return(nil);

    // 1.创建背景颜色为深灰色
    [self setupBgColor];

    // 2.添加一个返回到主场景的按钮,位于右上方
    [self addBackToMainBtnOnRightTop];



    // 3.添加演示按钮,点击后,展示不同的进度效果
    [self addShowBtns];

    // 返回创建好的场景对象
 return self;
}




// 3.添加演示按钮,点击后,展示不同的进度效果
- (void)addShowBtns
{
    // 1.创建一个精灵,并不添加到self
    _sprite = [CCSprite spriteWithImageNamed:@"nanaLogo.jpg"];
    _sprite.name = @"nana";
    // 2.相当于一个ProgressView,通过进度的形式,展示一个Sprite,(根据说明可知,其构造方法,需要Sprite)
    _progressNode = [CCProgressNode progressWithSprite:_sprite];
    // 也要设置位置
    _progressNode.position = ccp(self.contentSize.width*0.5,self.contentSize.height/2);



    // 3.雷达
    [self addBtn:@"【雷达】" position:ccp(0, 0) target:self sel:@selector(radarBtnClick)];
    // 4.bar
    [self addBtn:@"【bar】" position:ccp(0, 0.2) target:self sel:@selector(barBtnClick)];
    // 5.label
    [self addBtn:@"【Label】" position:ccp(0, 0.4) target:self sel:@selector(labelBtnClick)];
}

#pragma mark - 按钮点击
// 1.点击按钮,演示 【雷达进度条】
- (void)radarBtnClick
{
    [_progressNode removeFromParent];

    // 设置类型为:雷达进度条
    _progressNode.type = CCProgressNodeTypeRadial;
    // 范围:0 ~ 100  0表示什么也不显示
    _progressNode.percentage = 0;

    // 雷达的中心点,类似锚点
    _progressNode.midpoint = ccp(0.5,0.5);

    // 2.添加到self
    [self addChild:_progressNode];

    // 3.可以通过执行动作,实现进度条的增加,也可以通过消息调度update方法中
//    CCActionProgressFromTo *action = [CCActionProgressFromTo actionWithDuration:1 from:0 to:100];
//    [_progressNode runAction:action];
}
// 2.点击按钮,演示 【bar进度条】
- (void)barBtnClick
{
    [_progressNode removeFromParent];

    // 设置类型为:bar进度条
    _progressNode.type = CCProgressNodeTypeBar;
    // 范围:0 ~ 100  0表示什么也不显示
    _progressNode.percentage = 0;

    // bar的中心点,类似锚点,设置从左下角开始
    _progressNode.midpoint = ccp(0.0,0.0);

    // barChangeRate,是一个point,仅在bar条件下有效,只让X方向增加,Y方向不增加
    _progressNode.barChangeRate = ccp(1.0,0.0);

    // 注意:当barChangeRate中y为0时,表示Y方向不会增加,因此,midpoint的y可以随便写

    // 2.添加到self
    [self addChild:_progressNode];

    // 3.可以通过执行动作,实现进度条的增加,也可以通过消息调度update方法中
    //    CCActionProgressFromTo *action = [CCActionProgressFromTo actionWithDuration:1 from:0 to:100];
    //    [_progressNode runAction:action];
}
// 2.点击按钮,演示 【Label进度条】
- (void)labelBtnClick
{
    [_progressNode removeFromParent];
    // cocos2d默认字体:Marker Felt
    // 1.先展示一个白色的
    CCLabelTTF *bgWhiteLabel = [CCLabelTTF labelWithString:@"Loading..." fontName:@"Marker Felt" fontSize:60];
    bgWhiteLabel.position = ccp(self.contentSize.width*0.5,self.contentSize.height/2);
    [self addChild:bgWhiteLabel];

    // 2.创建一个红色的,但是一开始不显示,进度为0
    CCLabelTTF *redLabel = [CCLabelTTF labelWithString:@"Loading..." fontName:@"Marker Felt" fontSize:60];
    redLabel.color = [CCColor colorWithCcColor3b:ccc3(255, 0, 0)];

    _progressNode = [CCProgressNode progressWithSprite:redLabel];
    _progressNode.position = bgWhiteLabel.position;


    // 设置类型为:bar进度条
    _progressNode.type = CCProgressNodeTypeBar;
    // 范围:0 ~ 100  0表示什么也不显示
    _progressNode.percentage = 0;

    // bar的中心点,类似锚点,设置从左下角开始
    _progressNode.midpoint = ccp(0.0,0.0);

    // barChangeRate,是一个point,仅在bar条件下有效,只让X方向增加,Y方向不增加
    _progressNode.barChangeRate = ccp(1.0,0.0);

    // 注意:当barChangeRate中y为0时,表示Y方向不会增加,因此,midpoint的y可以随便写

    // 2.添加到self
    [self addChild:_progressNode];


}
#pragma mark - 消息调度
// cocos2d V3中, 只要实现update方法,就会自动调用
// 因此,也可以通过消息调度来实现 进度条的增加
- (void)update:(CCTime)delta
{
    _progressNode.percentage++;
}
#pragma mark - 抽取
// 添加一个按钮
- (void)addBtn:(NSString *)title position:(CGPoint)position target:(id)target sel:(SEL)sel
{
    // 创建一个按钮,点击后进入下一个场景
    CCButton *btn = [CCButton buttonWithTitle:title fontName:@"Verdana-Bold" fontSize:18.0f];
    btn.positionType = CCPositionTypeNormalized;
    // 例如:ccp(0.5f, 0.35f) 是位于屏幕的中间靠下方
    // 注意这里是笛卡尔坐标系,原点在左下方
    btn.position = position;
    btn.anchorPoint = ccp(0, 0);
    // 监听点击事件
    [btn setTarget:target selector:sel];
    [self addChild:btn];
}

#pragma mark - 固定写法
// 固定写法:右上方,创建一个返回按钮,点击后,返回至主场景
- (void)addBackToMainBtnOnRightTop
{
    // 5、右上方,创建一个返回按钮,点击后,返回至主场景
    CCButton *backButton = [CCButton buttonWithTitle:@"[ 回到Main ]" fontName:@"Verdana-Bold" fontSize:18.0f];
    backButton.positionType = CCPositionTypeNormalized;
    // 屏幕的右上方 注意这里是笛卡尔坐标系,原点在左下方
    backButton.position = ccp(0.85f, 0.95f);
    // 监听点击事件
    [backButton setTarget:self selector:@selector(backToMainBtnClicked)];
    [self addChild:backButton];
}

// 固定写法: 回到主场景
- (void)backToMainBtnClicked
{
    // 使用转场动画,切换场景至 主场景,动画:从左向右
    [[CCDirector sharedDirector] replaceScene:[NSClassFromString(@"MainScene") scene]
                               withTransition:[CCTransition transitionPushWithDirection:CCTransitionDirectionRight duration:1.0f]];
}

// 固定定法:创建背景颜色为深灰色
- (void)setupBgColor
{

    CCNodeColor *background = [CCNodeColor nodeWithColor:[CCColor colorWithRed:0.2f green:0.2f blue:0.2f alpha:1.0f]];
    [self addChild:background];
}

@end

**









**

最终效果图: 进度条节点【CCProgressNode 】, 构造时依赖一个Sprite 为 【CCProgressNode 】添加一个 CCActionProgressFromTo 动...

iOS_28仿QQ空间登录与退出

最终效果图如下:

图片 5

注意事项:< 喎?" target="_blank" class="keylink">vc3Ryb25nPjwvcD4KPHA+PHN0cm9uZz7K5Mjrv/K1xHJldHVybiBLZXk8L3N0cm9uZz48L3A+CjxwPjxzdHJvbmc+TWFpbi5zdG9yeWJvYXJk1tDOqiBMb2dpbkNvbnRyb2xsZXIgyejWw9K7uPZzdG9yeWJvYXJkSUQsPC9zdHJvbmc+PC9wPgo8cD48c3Ryb25nPtLUseO/ydLU1Nq0+sLr1tDNqLn9U3Rvcnlib2FyZLbUz/PKtcD9LLS0vahNYWluLnN0b3J5Ym9hcmTA78PmtcS/2NbGxvc8L3N0cm9uZz48L3A+CjxwPjxzdHJvbmc+PGJyPgo8L3N0cm9uZz48L3A+CjxwPjxzdHJvbmc+PGJyPgo8L3N0cm9uZz48L3A+CjxwPjxpbWcgc3JjPQ=="" alt="">

仿QQ窗口抖动

图片 6

dispach_after模拟延时

图片 7

输入框的return Key的不同处理方式

图片 8

Login控制器代码

//
//  LoginController.m
//  28_QQ空间
//
//  Created by beyond on 14-9-1.
//  Copyright (c) 2014年 com.beyond. All rights reserved.
//  Main.storyboard中初始化时的控制器,登录控制器 验证成功后,跳转至主控制器

#import "LoginController.h"
// 验证成功后,跳转至主控制器
#import "BeyondViewController.h"

@interface LoginController () 
#pragma mark - 拖线 属性
// 登录框整体
@property (weak, nonatomic) IBOutlet UIView *loginContentView;
// 帐号
@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;
// 自动登录btn
@property (weak, nonatomic) IBOutlet UIButton *autoLoginBtn;
// 加载中...
@property (weak, nonatomic) IBOutlet UIActivityIndicatorView *activityIndicator;
#pragma mark - 拖线 方法
// 登录按钮被点击
- (IBAction)loginBtnClicked;
// 点击了记住密码 或 自动登录
- (IBAction)checkboxBtnClicked:(UIButton *)sender;
@end

@implementation LoginController

- (void)viewDidLoad
{
    [super viewDidLoad];
    // 1.设置登陆控制器 的背景色 为全局深黑色
    self.view.backgroundColor = kGlobalBgColor;

    // 2.设置登录按钮不同状态下的背景
    [self.loginBtn setBtnBgImgForNormal:@"login_button_normal" highlightedName:@"login_button_pressed"];
}
// 点击屏幕空白处,退出键盘
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    [self.view endEditing:YES];
}
#pragma mark - 拖线方法
// 点击了记住密码 或 自动登录
- (IBAction)checkboxBtnClicked:(UIButton *)sender
{
    // 设置勾选 或 取消勾选
    sender.selected = ! sender.isSelected;
    // 重要~~~
    if (sender == self.rememberPwdBtn && !sender.isSelected) {
        // 取消了“记住密码”,这时候 就可以同时取消 自动登录了,因为用户不想记住密码,自然就无法实现 自动登录功能
        self.autoLoginBtn.selected = NO;
    } else if (sender == self.autoLoginBtn && sender.isSelected) {
        // 当用户 选中了“自动登录”,那么表示他想自动登录,那么可以同时把记住密码勾选上
        self.rememberPwdBtn.selected = YES;
    }
}
// 点击登录按钮
- (IBAction)loginBtnClicked
{
    // 1.验证帐号
    NSString *account = self.usernameField.text;
    if (account.length == 0) {
        [self showError:@"请输入帐号"];
        return;
    }

    // 2.验证密码
    NSString *password = self.passwordField.text;
    if (password.length == 0) {
        [self showError:@"请输入密码"];
        return;
    }

    // 3.发送请求
    self.view.userInteractionEnabled = NO;
    [self.activityIndicator startAnimating];

    // 模拟延时
    CGFloat delay = 2.0;
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delay * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        // 4.登录完毕(请求完毕)
        [self.activityIndicator stopAnimating];
        self.view.userInteractionEnabled = YES;

        // 5.账号密码同时为123才是正确
        if (![account isEqualToString:@"123"]) {
            [self showError:@"帐号或密码错误"];
            return;
        }
        if (![password isEqualToString:@"123"]) {
            [self showError:@"帐号或密码错误"];
            return;
        }

        // 6.登录成功  跳转到主页

        self.view.window.rootViewController = [[BeyondViewController alloc] init];
    });
}


#pragma mark - 自定义方法
// 提示错误信息
- (void)showError:(NSString *)errorMsg
{
    // 1.弹框提醒
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"登录失败" message:errorMsg delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];
    [alert show];

    // 2.仿QQ窗口抖动
    // 核心动画之 关键帧动画
    CAKeyframeAnimation *shakeAnim = [CAKeyframeAnimation animation];
    // 哪一个成员属性 需要动画,答:x
    shakeAnim.keyPath = @"transform.translation.x";
    shakeAnim.duration = 0.15;
    CGFloat delta = 10;
    // 数组,指定每一帧时的x值
    shakeAnim.values = @[@0, @(-delta), @(delta), @0];
    shakeAnim.repeatCount = 2;
    // 让view所在的图层执行 关键帧动画
    [self.loginContentView.layer addAnimation:shakeAnim forKey:nil];
}


#pragma mark - UITextField代理方法
// 控制器 键盘上returnKey在不同输入框下的作用,如Next 或 Done
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    if (textField == self.usernameField) {
        // 帐号输入框(Next)
        [self.passwordField becomeFirstResponder];
    } else {
        // 密码框(Done),调用自定义方法,执行登录
        [self loginBtnClicked];
    }
    return YES;
}

@end

退出,并且回到Main.storyboard里面的初始的登录控制器

图片 9

最终效果图如下: 注意事项: vc3Ryb25nPjwvcD4KPHA+PHN0cm9uZz7K5Mjrv/K1xHJldHVybiBLZXk8L3N0cm9uZz48L3A+CjxwPjxzdHJvbmc+TWFpbi5zdG9yeWJvYXJk1...

本文由今晚最快开奖现场直播发布于最快开奖计算机,转载请注明出处:iOS_28仿QQ空间登录与退出

关键词:

不用工具巧妙破解Windows,登陆口令

WindowsXP强盛而自身的系统界面博得了越来越多顾客的偏重,然则它对客商安全性的调查便是非常严厉的,假若你忘记...

详细>>

dynamic_cast对指针类型的转换

C++ dynamic_cast对指针类型的转换,dynamic_cast指针 C8-3 三角形还是长方形? (100.0/100 points) 题目描述 在多态概念中,基类...

详细>>

LeetCode House 罗布ber II

LeetCode House Robber II LeetCode -- House Robber II 标题陈说: Note: This is an extension of House Robber. After robbing those houses on that str...

详细>>

aes加密算法的一个问题

aes加密算法的二个标题,aes加密算法难题 百度“delphi aes”出来的结果,千篇生机勃勃律,都是互相转发,但是从未人...

详细>>