如果键盘隐藏任何元素而不仅仅是文本字段,则向上移动视图(不带导航栏)

时间:2014-12-31 16:39:12

标签: ios objective-c

我需要一种能够检查键盘显示时是否隐藏视图中任何元素的方法。如果是这样,我需要视图向上移动元素显示但没有导航栏移动。 提前致谢

#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;

}

4 个答案:

答案 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];
    }