我需要一种能够检查键盘显示时是否隐藏视图中任何元素的方法。如果是这样,我需要视图向上移动元素显示但没有导航栏移动。 提前致谢
#import "RequestViewController.h"
#define kOFFSET_FOR_KEYBOARD 80.0
@interface RequestViewController ()
@end
@implementation RequestViewController{
CGFloat keyboardHeight;
}
@synthesize descirptionTextView;
@synthesize scrollView;
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view
descirptionTextView.text = @"Comment";
descirptionTextView.textColor = [UIColor lightGrayColor];
descirptionTextView.delegate = self;
descirptionTextView.layer.cornerRadius = 8;
// border
[descirptionTextView.layer setBorderColor:[UIColor lightGrayColor].CGColor];
[descirptionTextView.layer setBorderWidth:0.5f];
// drop shadow
[descirptionTextView.layer setShadowColor:[UIColor blackColor].CGColor];
[descirptionTextView.layer setShadowOpacity:0.8];
[descirptionTextView.layer setShadowRadius:3.0];
[descirptionTextView.layer setShadowOffset:CGSizeMake(2.0, 2.0)];
// register for keyboard notifications
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWillShow:)
name:UIKeyboardWillShowNotification
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWillHide)
name:UIKeyboardWillHideNotification
object:nil];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (BOOL) textViewShouldBeginEditing:(UITextView *)textView
{
descirptionTextView.text = @"";
descirptionTextView.textColor = [UIColor blackColor];
return YES;
}
-(void) textViewDidChange:(UITextView *)textView
{
if(descirptionTextView.text.length == 0){
descirptionTextView.textColor = [UIColor lightGrayColor];
descirptionTextView.text = @"Comment";
[descirptionTextView resignFirstResponder];
}
}
/*
#pragma mark - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
}
*/
#pragma mark - Scrolling out of keyboard way
-(void)keyboardWillShow:(NSNotification *)nsNotification{
//first, get height of keyboard
NSDictionary *userInfo = [nsNotification userInfo];
CGRect kbRect = [[userInfo objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue];
keyboardHeight = kbRect.size.height;
scrollView.frame = CGRectMake(scrollView.frame.origin.x, scrollView.frame.origin.y, scrollView.frame.size.width, self.view.frame.size.height - keyboardHeight - scrollView.frame.origin.y);
return;
}
-(void)keyboardWillHide{
scrollView.frame = CGRectMake(scrollView.frame.origin.x, scrollView.frame.origin.y, scrollView.frame.size.width, scrollView.frame.size.height + keyboardHeight - 40 - 40 - 14 + scrollView.frame.origin.y);
return;
}
答案 0 :(得分:0)
您可以在键盘委托方法中重绘您的视图: keyboardWillShow keyboardWillHide
答案 1 :(得分:0)
声明名为keyboardHeight的CGFloat属性。
在viewDidLoad方法中:
// register for keyboard notifications
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWillShow:)
name:UIKeyboardWillShowNotification
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWillHide)
name:UIKeyboardWillHideNotification
object:nil];
键盘方法:
-(void)keyboardWillShow:(NSNotification *)nsNotification{
//first, get height of keyboard
NSDictionary *userInfo = [nsNotification userInfo];
CGRect kbRect = [[userInfo objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue];
keyboardHeight = kbRect.size.height;
scrollView.frame = CGRectMake(scrollView.frame.origin.x, scrollView.frame.origin.y, scrollView.frame.size.width, self.view.frame.size.height - keyboardHeight - scrollView.frame.origin.y);
return;
}
-(void)keyboardWillHide{
scrollView.frame = CGRectMake(scrollView.frame.origin.x, scrollView.frame.origin.y, scrollView.frame.size.width, scrollView.frame.size.height + keyboardHeight - 40 - 40 - 14 + scrollView.frame.origin.y);
return;
}
您还应该能够将scrollView替换为self.view
答案 2 :(得分:0)
当键盘出现时,你将可视区域减少了相当多的数量,所以除非你有一个可以用较小区域重新运行的布局,你真正想要的是能够滚动。
通常,您希望根据哪个字段是第一个响应者来选择滚动到的位置。这将保证用户永远不会编辑他们看不到的字段。
修改此控制器的视图层次结构,使其包含在UIScrollView
中。另外,在实例变量中跟踪哪个字段是firstResponder
。然后,回复如下的键盘通知:
- (void)keyboardWillShow:(NSNotification*)notification
{
NSValue* keyboardFrameValue = [notification.userInfo objectForKey:UIKeyboardFrameEndUserInfoKey];
CGRect kbRect = [self.view convertRect:keyboardFrameValue.CGRectValue fromView:nil];
CGRect overlap = CGRectIntersection(self.view.bounds, kbRect);
self.scroller.contentInset = UIEdgeInsetsMake(self.scroller.contentInset.top, 0, overlap.size.height, 0);
if (self.firstResponderView)
{
CGRect fieldRect = [self.scroller convertRect:self.firstResponderView.frame fromView:self.firstResponderView.superview];
[self.scroller scrollRectToVisible:fieldRect animated:YES];
}
}
答案 3 :(得分:0)
好吧,可以使用像这样的库:https://github.com/michaeltyson/TPKeyboardAvoiding,或者他可以通过编程方式执行。这就是我的进展:
link_directories(/path/to/Framework)
find_library(THE_FRAMEWORK
NAMES TheFramework
HINT "/path/to/Framework"
REQUIRED)
target_link_libraries(${PROJECT_NAME} ${THE_FRAMEWORK})
然后添加这些选择器方法
//adding the notification about when keyboard appears and disappears when the view loads and remove them when the view will disappear
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil];
}