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にソースコードがあるジェスチャーロック解除の文章を書きます.
Home ,App , Show , , 。 UIWindow 。
#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;
}
-(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];
}
}
#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)]];
}
-(void)show
{
[self makeKeyWindow];
[self configConstrain];
self.hidden = NO;
}
- (void)applicationDidEnterBackground:(UIApplication *)application {
[[LockScreen shareInstance] show];
}
UIWindowはUIViewのサブクラスであるため、UIViewのメソッド、例えばaddSubviewなどを使用することができる.
今回はパスワードロック画面インタフェースで、githubにソースコードがあるジェスチャーロック解除の文章を書きます.