2017-02-24 113 views
0

我正在处理我的应用程序中的一个棘手的错误。我有一个聊天视图控制器,我处理键盘显示和隐藏。但奇怪的部分是将应用程序放在背景上。从应用程序返回应用程序时获取黑屏

这是睡前背景(攻home键)视图控制器

enter image description here

这从背景

enter image description here

返回时,如果我把是应用程序使用主屏幕按钮的背景应用程序,黑屏仅出现一秒钟,但如果我阻止手机然后解锁,黑屏将保持在那里。

这是我如何处理键盘

- (void)keyboardWillShowWithRect:(CGRect)rect 
{ 
    //We adjust inverted insets because tableview will be inverted 
    CGFloat displacementDistance = rect.size.height - self.composeBarView.bounds.size.height; 
    self.tableView.contentInset = UIEdgeInsetsMake(self.composeBarView.bounds.size.height, 0, displacementDistance, 0); 
    [self.view setFrame:CGRectMake(self.view.frame.origin.x, self.view.frame.origin.y - displacementDistance, self.view.frame.size.width, self.view.frame.size.height)]; 
} 

- (void)keyboardWillDismissWithRect:(CGRect)rect 
{ 
    //We adjust inverted insets because tableview will be inverted 
    CGFloat displacementDistance = rect.size.height - self.composeBarView.bounds.size.height; 
    self.tableView.contentInset = UIEdgeInsetsMake(self.composeBarView.bounds.size.height, 0, 0, 0); 
    [self.view setFrame:CGRectMake(self.view.frame.origin.x, self.view.frame.origin.y + displacementDistance, self.view.frame.size.width, self.view.frame.size.height)]; 
} 

的的tableView用于显示,以便在底部显示的第一消息被反转的消息。下面是我如何做到这一点:

- (void)setupTableView 
{ 
    self.tableView.delegate = self; 
    self.tableView.dataSource = self; 
    //We adjust inverted insets because tableview will be inverted 
    self.tableView.contentInset = UIEdgeInsetsMake(self.composeBarView.bounds.size.height, 0, 0, 0); 
    self.tableView.rowHeight = UITableViewAutomaticDimension; 
    self.tableView.estimatedRowHeight = 500.0; 
    self.tableView.sectionFooterHeight = 30.0; 
    self.tableView.showsVerticalScrollIndicator = NO; 
    [self.tableView registerNib:[UINib nibWithNibName:@"MessagesDateHeader" bundle:nil] forHeaderFooterViewReuseIdentifier:@"MessagesDateHeader"]; 

    // Table View is inverted so we display last messages at the bottom instead of top 
    self.tableView.transform = CGAffineTransformMakeRotation(-M_PI); 
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(didTapOnTableView)]; 
    tap.numberOfTapsRequired = 1; 
    [self.tableView addGestureRecognizer:tap]; 
} 

另外,我有self.definesPresentationContext = YES;集上viewDidLoad

任何人都可以给我发生了什么的暗示?

谢谢

+0

尝试Xcode的查看调试功能。它应该向你展示它认为正在展示的观点及其关系。 –

+0

你想用'self.tableView.transform = CGAffineTransformMakeRotation(-M_PI)'实现什么?这将旋转视图,但不会更改背景中的消息 – lukwuerz

+0

Befor应用的顺序。检查您的关键字是否存在或不在屏幕上。对于关键字解雇方法或查看您可以使用[self.view endEditing:YES]; –

回答

1

我曾经有一个类似的问题。问题是当键盘根据其框架出现/消失时调整tableView的大小。 我所做的是在tableView的底部和superView之间设置一个约束,然后通过键盘的出现/消失来改变它的常量。

而不是依靠keyboardWillShowWithRect:keyboardWillDismissWithRect:你可以用听UIKeyboardWillChangeFrameNotification和处理它喜欢的如下

- (void) keyboardWillChangeFrame:(NSNotification *)notification { 
    NSDictionary *userInfo = [notification userInfo]; 
    CGRect keyboardFrameEnd = [userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue]; 
    keyboardFrameEnd = [self.view convertRect:keyboardFrameEnd toView:nil]; 

    [UIView animateWithDuration:[userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue] 
          delay:0.f 
         options:[userInfo[UIKeyboardAnimationCurveUserInfoKey] intValue] << 16 
        animations:^{ 
     self.bottomConstraint.constant = CGRectGetHeight(self.view.frame) - keyboardFrameEnd.origin.y; 
     [self.view layoutIfNeeded]; 
        } completion:nil]; 
} 

[self.view layoutIfNeeded]使用,以便视图显示了整个动画

+0

它工作。非常感谢:D – WedgeSparda