iOS開発実戦-スクリーンロックインタフェース(パスワードロック解除)

5033 ワード

改編は支付宝がホームに戻って再び開いた後のジェスチャー解錠に似ていることを紹介し、異なるのは改編紹介の解錠方法はジェスチャー解錠ではなくパスワードを入力することであり、次回はジェスチャー解錠の実戦紹介を単独で書く機会がある.

関連する知識点

  • UIWindow
  • AutoLayout
  • UIButton,UITextField
  • AppDelegate

  • かいはつ


    基本的な考え方:
     Home ,App , Show , , 。 UIWindow 。
    

    UIウィンドウロック画面の作成


    1.まずUIWindowを継承するクラスを新規作成し、このプロジェクトでLockScreenと名付けました.
    2.LockScreenは単一のモデルに設計されている.
    .hファイルに2つの方法、単例とshowを追加します.
    #LockScreen.h
    @interface LockScreen : UIWindow
    +(id)shareInstance;
    -(void)show;
    @end

    イニシャルコード
    #LockScreen.m
    +(id)shareInstance
    {
        static dispatch_once_t  once;
        static LockScreen * unlockWindow = nil;
        dispatch_once(&once, ^{
            unlockWindow = [[LockScreen alloc] initWithFrame:[UIScreen mainScreen].bounds];
        });
        return unlockWindow;
    }
    
    -(instancetype)initWithFrame:(CGRect)frame
    {
        self = [super initWithFrame:frame];
        if (self) {
            self.windowLevel = UIWindowLevelAlert;
            [self setBackgroundColor:[UIColor groupTableViewBackgroundColor]];
            [self addSubview:self.passwordField];
            [self addSubview:self.doneButton];
        }
        return self;
    }

    上のコードの中で、1つのwindowLevelの属性があって、これはUIWindowのありかの階層を設定するので、システムは3種類の階層を提供して、同じく階層をカスタマイズすることができて、値を変えるのは1つのlongのタイプのためです
    UIKIT_EXTERN const UIWindowLevel UIWindowLevelNormal; //最下層
    UIKIT_EXTERN const UIWindowLevel UIWindowLevelAlert; //最上階
    UIKIT_EXTERN const UIWindowLevel UIWindowLevelStatusBar; ///中間層
    3.2つのコントロール(UItextField,UIButton)を追加
    -(UITextField *)passwordField
    {
        if (!_passwordField) {
            _passwordField = [[UITextField alloc]init];
            _passwordField.secureTextEntry = YES;
            _passwordField.placeholder = @" ";
            _passwordField.backgroundColor = [UIColor whiteColor];
        }
        return _passwordField;
    }
    
    -(UIButton *)doneButton
    {
        if (!_doneButton) {
            _doneButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
            [_doneButton addTarget:self
                            action:@selector(tapButton:)
                  forControlEvents:UIControlEventTouchUpInside];
            [_doneButton setTitle:@" " forState:UIControlStateNormal];
            [_doneButton setBackgroundColor:[UIColor lightGrayColor]];
        }
        return _doneButton;
    }
    #pragma mark - button status
    -(IBAction)tapButton:(id)sender
    {
        if ([self.passwordField.text isEqualToString:@"abc123"]) {
            
            [self resignKeyWindow];
            self.hidden = YES;
        }
        else
        {
            UIAlertView * alter = [[UIAlertView alloc] initWithTitle:@"Warning" message:@"password error" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
            [alter show];
        }
    }
    
    パスワードが間違っている場合は、警告ボックスがポップアップされます.
    4.setFrameではなくコントロールにconstrainを設定する
    もちろんsetFrameでコントロールのサイズを定義することもできますが、autolayoutは異なるサイズの画面に適しています.Autolayoutのご紹介はこちらを押してください
    #pragma mark - text field delegate
    -(void)configConstrain
    {
        UITextField * passwordTextField = self.passwordField;
        UIButton * doneButton = self.doneButton;
        passwordTextField.translatesAutoresizingMaskIntoConstraints = NO;
        doneButton.translatesAutoresizingMaskIntoConstraints = NO;
        [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-50-[passwordTextField]-50-|"
                                                                    options:0
                                                                    metrics:nil
                                                                      views:NSDictionaryOfVariableBindings(passwordTextField)]];
        
        [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-100-[doneButton]-100-|"
                                                                     options:0
                                                                     metrics:nil
                                                                       views:NSDictionaryOfVariableBindings(doneButton)]];
        CGFloat middleHeight = [UIScreen mainScreen].bounds.size.height/2;
        [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[passwordTextField(50)]-30-[doneButton(50)]-middleHeight-|" options:0 metrics:@{@"middleHeight":@(middleHeight)} views:NSDictionaryOfVariableBindings(passwordTextField,doneButton)]];
        
    }
    

    5.show LockScreen
    -(void)show
    {
        [self makeKeyWindow];
        [self configConstrain];
        self.hidden = NO;
    }
    コード中のmakeKeyWindowは、UIWindowをキーボード応答可能に設定した状態である.

    AppDelegateでmにコードを追加


    5.AppDelegate.mにコードを追加
    - (void)applicationDidEnterBackground:(UIApplication *)application {
        [[LockScreen shareInstance] show];
    }
    
    プログラムがバックグラウンドに入ると、ロック画面のshowが出ます.
    6.Bingo、運行^^

    後記


    UIWindowはUIViewのサブクラスであるため、UIViewのメソッド、例えばaddSubviewなどを使用することができる.
    今回はパスワードロック画面インタフェースで、githubにソースコードがあるジェスチャーロック解除の文章を書きます.