看示例代码:
#import "ViewController.h"
#import "NetworkManagement.h"
// 键盘高度缓冲值
#define INTERVAL_KEYBOARD 10
@interface ViewController ()<UITextFieldDelegate>
@property (nonatomic, weak) UITextField *codeField;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.title = @"绑定";
[self setUpUI];
//增加监听,当键盘出现或改变时收出消息
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWillShow:)
name:UIKeyboardWillShowNotification
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWillHide:)
name:UIKeyboardWillHideNotification
object:nil];
}
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
- (void)setUpUI {
self.view.backgroundColor = [UIColor whiteColor];
UIImageView *imageView = [UIImageView new];
imageView.image = [UIImage imageNamed:@"bind_doctor"];
[self.view addSubview:imageView];
UITextField *codeField = [UITextField new];
_codeField = codeField;
_codeField.placeholder = @"请输入医生邀请码";
_codeField.backgroundColor = UIColorFromHex(0xf8f8f8);
_codeField.keyboardType = UIKeyboardTypeASCIICapable;
_codeField.returnKeyType = UIReturnKeyDone;
_codeField.autocapitalizationType = UITextAutocapitalizationTypeNone;
_codeField.delegate = self;
[self.view addSubview:_codeField];
UIButton *confirmBtn = [UIButton new];
[confirmBtn setTitle:@"确认" forState:UIControlStateNormal];
[confirmBtn setTitleColor:UIColorFromHex(0xacacac) forState:UIControlStateNormal];
[confirmBtn setBackgroundImage:[UIImage imageNamed:@"login_button"] forState:UIControlStateNormal];
[confirmBtn addTarget:self action:@selector(confirmBtnClick) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:confirmBtn];
__weak __typeof(&*self)ws = self;
[imageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(ws.view.mas_top).with.offset(70);
make.centerX.equalTo(ws.view);
make.width.equalTo(@250);
make.height.equalTo(@275);
}];
[_codeField mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(imageView.mas_bottom);
//make.centerX.equalTo(ws.view);
make.height.equalTo(@(50));
make.left.equalTo(ws.view).with.offset(20);
make.right.equalTo(ws.view).with.offset(-20);
}];
[confirmBtn mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(_codeField.mas_bottom).with.offset(30);
//make.centerX.equalTo(ws.view);
make.height.equalTo(_codeField.mas_height);
make.left.and.right.equalTo(_codeField);
}];
}
// 2.按钮点击事件
- (void)confirmBtnClick {
NSString *code = self.codeField.text;
if (code.length > 0) {
[[SCNetworkManagement sharedNetwork] bindDoctorWithCode:(NSString *)code block:^(SC_NETWORK_ERROR rv, NSString *errMsg) {
if (rv == SC_NETWORK_ERROR_OK) {
[MBProgressHUD showSuccess:@"绑定成功"];
[self.navigationController popViewControllerAnimated:YES];
} else {
[MBProgressHUD showError:errMsg];
}
}];
} else {
[MBProgressHUD showError:@"请输入医生邀请码"];
}
}
//退出键盘
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
if (![_codeField isExclusiveTouch]) {
[_codeField resignFirstResponder];
}
}
//点击return 按钮 去掉
-(BOOL)textFieldShouldReturn:(UITextField *)textField
{
[_codeField resignFirstResponder];
return YES;
}
#pragma mark - keyboard events
///键盘显示事件
- (void) keyboardWillShow:(NSNotification *)notification {
//获取键盘高度,在不同设备上,以及中英文下是不同的
CGFloat kbHeight = [[notification.userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size.height;
//计算出键盘顶端到inputTextView panel底端的距离(加上自定义的缓冲距离INTERVAL_KEYBOARD)
CGFloat offset = (_codeField.frame.origin.y+_codeField.frame.size.height+INTERVAL_KEYBOARD) - (self.view.frame.size.height - kbHeight);
// 取得键盘的动画时间,这样可以在视图上移的时候更连贯
double duration = [[notification.userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];
//将视图上移计算好的偏移
if(offset > 0) {
[UIView animateWithDuration:duration animations:^{
self.view.frame = CGRectMake(0.0f, -offset, self.view.frame.size.width, self.view.frame.size.height);
}];
}
}
///键盘消失事件
- (void) keyboardWillHide:(NSNotification *)notify {
// 键盘动画时间
double duration = [[notify.userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];
//视图下沉恢复原状
[UIView animateWithDuration:duration animations:^{
self.view.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
}];
}
@end