iOS TPKeyboardAvoiding自动识别键盘的高度
#import <UIKit/UIKit.h> @interface AppDelegate : UIResponder <UIApplicationDelegate> @property (strong, nonatomic) UIWindow *window; @end
#import "AppDelegate.h"
#import "RootViewController.h"
@interface AppDelegate () @end @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
self.window.backgroundColor = [UIColor whiteColor]; UINavigationController *navi = [[UINavigationController alloc] initWithRootViewController:[[RootViewController alloc] init]];
self.window.rootViewController = navi; [self.window makeKeyAndVisible];
return YES;
} @end
#import <UIKit/UIKit.h>
#import "TPKeyboardAvoidingScrollView.h" @interface RootViewController : UIViewController @property(nonatomic, assign) NSInteger id;
//@property(nonatomic, copy) NSString *name;//姓名
//@property(nonatomic, copy) NSString *bankAccount;//银行账号
//@property(nonatomic, copy) NSString *bankName;// 开户的银行
@property(nonatomic, strong) TPKeyboardAvoidingScrollView *backgroundView;//背景图 @end
#import "RootViewController.h" #define WIDTH [UIScreen mainScreen].bounds.size.width
#define TAG 10000
#define topHeight 20 @interface RootViewController ()
{
UIImageView *lineView;
}
@end @implementation RootViewController - (void)viewDidLoad {
[super viewDidLoad];
//适配ios7
if([UIDevice currentDevice].systemVersion.floatValue >= 7.0) {
self.edgesForExtendedLayout = UIRectEdgeNone;
self.extendedLayoutIncludesOpaqueBars = NO;
self.modalPresentationCapturesStatusBarAppearance = NO;
}
self.title = @"绑定银行卡"; _backgroundView = [[TPKeyboardAvoidingScrollView alloc] initWithFrame:CGRectMake(, , WIDTH, [UIScreen mainScreen].bounds.size.height - )];
// _backgroundView.backgroundColor = [UIColor orangeColor];
[self.view addSubview:_backgroundView]; //初始化label
[self setupLable:CGRectMake(, topHeight, , ) title:@"开户银行:"];
[self setupLable:CGRectMake(, topHeight+, , ) title:@"开户归属地:"];
[self setupLable:CGRectMake(, topHeight+, , ) title:@"姓 名:"];
[self setupLable:CGRectMake(, topHeight+, , ) title:@"账 号:"];
[self setupLable:CGRectMake(, topHeight+, , ) title:@"验证码:"];
//初始化银行类型textField
[self setupTextField:CGRectMake(, topHeight, (WIDTH - )-, ) placeholder:@"请输入银行类型" index:];
//初始化省份textField
UITextField *provinceTF = [self setupTextField:CGRectMake(, topHeight+,(WIDTH - - (+) - )/2.0, ) placeholder:@"请输入省份" index:];
//小细线
lineView = [[UIImageView alloc] initWithFrame:CGRectMake(CGRectGetMaxX(provinceTF.frame)+, CGRectGetMidY(provinceTF.frame), , )];
lineView.backgroundColor = [UIColor lightGrayColor];
[self.backgroundView addSubview:lineView];
//初始化地级市textField
[self setupTextField:CGRectMake(CGRectGetMaxX(lineView.frame)+, topHeight+, (WIDTH - - (+) - )/2.0, ) placeholder:@"请输入地级市" index:];
//初始化姓名textField
[self setupTextField:CGRectMake(, topHeight+, (WIDTH - )-, ) placeholder:@"请输入姓名" index:];
//初始化银行账号textField
[self setupTextField:CGRectMake(, topHeight+, (WIDTH - )-, ) placeholder:@"请输入银行账号" index:];
//初始化验证码textField(100是获取验证码按钮的宽度)
UITextField *securityCodeTF = [self setupTextField:CGRectMake(, topHeight+, (WIDTH - )- - - , ) placeholder:@"验证码" index:];
//初始化确定按钮
[self setupButton:CGRectMake((WIDTH - )/2.0,CGRectGetMaxY(securityCodeTF.frame)+ /*_backgroundView.frame.size.height - 30*/, , ) title:@"确定" image:@"确定按钮.png" selector:@selector(makeSureAction:)]; //初始化获取验证码按钮
[self setupButton:CGRectMake(CGRectGetMaxX(securityCodeTF.frame)+ , topHeight+, , ) title:@"获取验证码" image:@"矩形-2.png" selector:@selector(getSecurityCode:)]; }
/**
* 获取验证码
*/
- (void)getSecurityCode:(UIButton *)sender{
NSLog(@"获取验证码操作");
} // 点击确定按钮,提交数据
- (void)makeSureAction:(UIButton *)sender{
NSLog(@"提交前需要判断");
}
/**
* 初始化button
*/
- (void)setupButton:(CGRect)frame title:(NSString *)title image:(NSString *)imageName selector:(SEL)selectorName{
UIButton *securityCode = [UIButton buttonWithType:UIButtonTypeCustom];
securityCode.frame = frame;
securityCode.layer.cornerRadius = 5.2;
[securityCode setTitle:title forState:];
securityCode.clipsToBounds = YES;
securityCode.titleLabel.font = [UIFont systemFontOfSize:];
[securityCode setBackgroundImage:[UIImage imageNamed:imageName] forState:];
[securityCode addTarget:self action:selectorName forControlEvents:UIControlEventTouchUpInside];
[self.backgroundView addSubview:securityCode];
}
/**
* 初始化UITextField
*/
- (UITextField *)setupTextField:(CGRect)frame placeholder:(NSString *)context index:(NSInteger)tag{
UITextField *tf = [[UITextField alloc] initWithFrame:frame];
tf.font = [UIFont systemFontOfSize:];
tf.placeholder = context;
tf.tag = TAG + tag;
tf.borderStyle = UITextBorderStyleRoundedRect;
[self.backgroundView addSubview:tf];
return tf;
}
/**
* 初始化UILabel
*/
- (void)setupLable:(CGRect)frame title:(NSString*)content{
UILabel *label = [[UILabel alloc] initWithFrame:frame];
label.text = content;
label.font = [UIFont systemFontOfSize:];
label.textAlignment = NSTextAlignmentRight;
[self.backgroundView addSubview:label];
} - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)even{
[self.view endEditing:YES];
} - (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning]; } @end
/**
* 第三方框架(TPKeyboardAvoiding)的代码
*/
#import <UIKit/UIKit.h> @interface TPKeyboardAvoidingScrollView : UIScrollView{ UIEdgeInsets _priorInset;
BOOL _priorInsetSaved;
BOOL _keyboardVisible;
CGRect _keyboardRect;
CGSize _originalContentSize;
} - (void)adjustOffsetToIdealIfNeeded; @end
/**
* 第三方框架(TPKeyboardAvoiding)的代码
*/
#import "TPKeyboardAvoidingScrollView.h" #define _UIKeyboardFrameEndUserInfoKey (&UIKeyboardFrameEndUserInfoKey != NULL ? UIKeyboardFrameEndUserInfoKey : @"UIKeyboardBoundsUserInfoKey") #define SCREEN_WIDTH [UIScreen mainScreen].bounds.size.width
#define SCREEN_HEIGHT [UIScreen mainScreen].bounds.size.height @interface TPKeyboardAvoidingScrollView ()
- (UIView*)findFirstResponderBeneathView:(UIView*)view;
- (UIEdgeInsets)contentInsetForKeyboard;
- (CGFloat)idealOffsetForView:(UIView *)view withSpace:(CGFloat)space;
- (CGRect)keyboardRect;
@end @implementation TPKeyboardAvoidingScrollView - (void)setup {
_priorInsetSaved = NO;
if ( CGSizeEqualToSize(self.contentSize, CGSizeZero) ) {
self.contentSize = self.bounds.size;
}
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
} -(id)initWithFrame:(CGRect)frame {
if ( !(self = [super initWithFrame:frame]) ) return nil;
[self setup];
return self; } -(void)awakeFromNib {
[self setup];
} -(void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
[super dealloc];
} -(void)setFrame:(CGRect)frame {
[super setFrame:frame]; CGSize contentSize = _originalContentSize;
contentSize.width = MAX(contentSize.width, SCREEN_WIDTH);
contentSize.height = MAX(contentSize.height, SCREEN_HEIGHT-);
[super setContentSize:contentSize]; if ( _keyboardVisible ) {
self.contentInset = [self contentInsetForKeyboard];
}
} -(void)setContentSize:(CGSize)contentSize {
_originalContentSize = contentSize; contentSize.width = MAX(contentSize.width, contentSize.width);
contentSize.height = MAX(contentSize.height, contentSize.height);
[super setContentSize:contentSize]; if ( _keyboardVisible ) {
self.contentInset = [self contentInsetForKeyboard];
}
} - (void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
[[self findFirstResponderBeneathView:self] resignFirstResponder];
[super touchesEnded:touches withEvent:event];
} - (void)keyboardWillShow:(NSNotification*)notification {
_keyboardRect = [[[notification userInfo] objectForKey:_UIKeyboardFrameEndUserInfoKey] CGRectValue];
_keyboardVisible = YES; UIView *firstResponder = [self findFirstResponderBeneathView:self];
if ( !firstResponder ) {
// No child view is the first responder - nothing to do here
return;
} if (!_priorInsetSaved) {
_priorInset = self.contentInset;
_priorInsetSaved = YES;
} // Shrink view's inset by the keyboard's height, and scroll to show the text field/view being edited
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationCurve:[[[notification userInfo] objectForKey:UIKeyboardAnimationCurveUserInfoKey] intValue]];
[UIView setAnimationDuration:[[[notification userInfo] objectForKey:UIKeyboardAnimationDurationUserInfoKey] floatValue]]; self.contentInset = [self contentInsetForKeyboard];
[self setContentOffset:CGPointMake(self.contentOffset.x,
[self idealOffsetForView:firstResponder withSpace:[self keyboardRect].origin.y - self.bounds.origin.y])
animated:YES]; [UIView commitAnimations];
} - (void)keyboardWillHide:(NSNotification*)notification {
_keyboardRect = CGRectZero;
_keyboardVisible = NO; // Restore dimensions to prior size
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationCurve:[[[notification userInfo] objectForKey:UIKeyboardAnimationCurveUserInfoKey] intValue]];
[UIView setAnimationDuration:[[[notification userInfo] objectForKey:UIKeyboardAnimationDurationUserInfoKey] floatValue]];
self.contentInset = _priorInset;
_priorInsetSaved = NO;
[UIView commitAnimations];
} - (UIView*)findFirstResponderBeneathView:(UIView*)view {
// Search recursively for first responder
for ( UIView *childView in view.subviews ) {
if ( [childView respondsToSelector:@selector(isFirstResponder)] && [childView isFirstResponder] ) return childView;
UIView *result = [self findFirstResponderBeneathView:childView];
if ( result ) return result;
}
return nil;
} - (UIEdgeInsets)contentInsetForKeyboard {
UIEdgeInsets newInset = self.contentInset;
CGRect keyboardRect = [self keyboardRect];
newInset.bottom = keyboardRect.size.height - ((keyboardRect.origin.y+keyboardRect.size.height) - (self.bounds.origin.y+self.bounds.size.height));
return newInset;
} -(CGFloat)idealOffsetForView:(UIView *)view withSpace:(CGFloat)space { // Convert the rect to get the view's distance from the top of the scrollView.
CGRect rect = [view convertRect:view.bounds toView:self]; // Set starting offset to that point
CGFloat offset = rect.origin.y; if ( self.contentSize.height - offset < space ) {
// Scroll to the bottom
offset = self.contentSize.height - space;
} else {
if ( view.bounds.size.height < space ) {
// Center vertically if there's room
offset -= floor((space-view.bounds.size.height)/2.0);
}
if ( offset + space > self.contentSize.height ) {
// Clamp to content size
offset = self.contentSize.height - space;
}
} if (offset < ) offset = ; return offset;
} -(void)adjustOffsetToIdealIfNeeded { // Only do this if the keyboard is already visible
if ( !_keyboardVisible ) return; CGFloat visibleSpace = self.bounds.size.height - self.contentInset.top - self.contentInset.bottom; CGPoint idealOffset = CGPointMake(, [self idealOffsetForView:[self findFirstResponderBeneathView:self] withSpace:visibleSpace]); [self setContentOffset:idealOffset animated:YES];
} - (CGRect)keyboardRect {
CGRect keyboardRect = [self convertRect:_keyboardRect fromView:nil];
if ( keyboardRect.origin.y == ) {
CGRect screenBounds = [self convertRect:[UIScreen mainScreen].bounds fromView:nil];
keyboardRect.origin = CGPointMake(, screenBounds.size.height - keyboardRect.size.height);
}
return keyboardRect;
} /*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {
// Drawing code
}
*/ @end
iOS TPKeyboardAvoiding自动识别键盘的高度的更多相关文章
- 转 iOS获取软键盘的高度
- (void)viewDidLoad { [super viewDidLoad]; //增加监听,当键盘出现或改变时收出消息 [[NSNotificationCenter defaultCenter ...
- iOS之 利用通知(NSNotificationCenter)获取键盘的高度,以及显示和隐藏键盘时修改界面的注意事项
我们在开发中会遇到这样的情况:调用键盘时需要界面有一个调整,避免键盘遮掩输入框. 但实现时你会发现,在不同的手机上键盘的高度是不同的.这里列举一下: //获取键盘的高度 /* iphone 6: 中文 ...
- 79.iOS 设备的UI规范和iOS各控件默认高度
iOS设备的UI 规范 iPhone界面尺寸 iPhone图标尺寸 iPad的设计尺寸 iPad图标尺寸 iPhone设备尺寸分辨率比例 iPhone各设备 launch image iOS 各种控件 ...
- Xamarin的不归路-ios模拟器没有键盘
ios模拟器没有键盘解决方案: 勾选上就有了. 2016年9月1日
- IOS TextField伴随键盘移动
这篇文章介绍的是一个简单而又实用的小方法. 我想对于登陆时的一些效果大家应该都不会陌生. 今天就介绍一下,当开始输入TextField文本时键盘弹出TextField伴随键盘移动的实现. 先看一下演示 ...
- ios 弹出键盘 视图向上平移
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(keyboardwillAppear:) name:U ...
- ios如何判断键盘是否已经显示
ios如何判断键盘是否已经显示 在群里看到有人问:ios如何判断键盘已经显示在界面上. 其实这个解决很简单: 写一个单例来管理键盘的状态. 这个单例在初始化方法init种监听2个事件,分别是 UI ...
- ios自定义数字键盘
因为项目又一个提现的功能,textfiled文本框输入需要弹出数字键盘,首先想到的就是设置textfiled的keyboardType为numberPad,此时你会看到如下的效果: 但是很遗憾这样 ...
- IOS中input键盘事件支持的解决方法
欢迎大家去我的网站详细查看http://genghongshuo.com.cn/ IOS中input键盘事件keyup.keydown.等支持不是很好, 用input监听键盘keyup事件,在安卓手机 ...
随机推荐
- 【FFXV】中物理模拟的结构以及游戏业界的乐趣
11月2日是在日本兵库县神户会议中心召开的[SIGGRAPH ASIA 2015]的第一天,在游戏开发专门的研究会[R&D in the Video Game Industry]上,展开了[F ...
- 【SIGGRAPH 2015】【巫师3 狂猎 The Witcher 3: Wild Hunt 】顶级的开放世界游戏的实现技术。
[SIGGRAPH 2015][巫师3 狂猎 The Witcher 3: Wild Hunt ]顶级的开放世界游戏的实现技术 作者:西川善司 日文链接 http://www.4gamer.net/ ...
- ecshop退款订单原理分析
ecshop退款订单原理分析 时间:2013-04-12 23:41来源:www.chinab4c.com 作者:ecshop专家 点击:799 咨询qq:760868471咨询旺旺 ecshop退款 ...
- Eclipse中用User Library管理jar包
目的:为了更方便的管理jar包,而不是一股脑儿的将引用的jar包全部放在Web App Library下. 管理和配置: 第一步:管理 新建Library并引入项目中 右键项目->Build P ...
- 验证码 mewebstudio/captcha
composer require mews/captcha https://github.com/mewebstudio/captcha
- 发现美的眼睛 Prepared SQL Statement
DROP PROCEDURE IF EXISTS truncate_insert_sales_rank_toparow_month; DELIMITER /w/ CREATE PROCEDURE tr ...
- Apache Camel
Apache Camel 1 import org.apache.camel.CamelContext; import org.apache.camel.builder.RouteBuilder; i ...
- C/C++预处理和编译
预处理器的作用 当我们对源代码进行编译时,第一个阶段就是进行预处理.以#开头的都是预处理指令,都会被预处理器处理掉. 也就是说:我们写的代码,不是直接被编译,而是先被预处理器进行修改.那么预处理器如何 ...
- JS框架比较
https://www.oschina.net/translate/comparison-of-js-frameworks这几个框架我都用过1. Ember 2.x已经没有script标签在页面里了, ...
- 【Android测试】【随笔】与 “58同城” 测试开发交流
◆版权声明:本文出自胖喵~的博客,转载必须注明出处. 转载请注明出处:http://www.cnblogs.com/by-dream/p/5384698.html 初衷 一直都有一个这样的想法: 虽然 ...