ios - 应用程序从后台返回时黑屏

标签 ios objective-c iphone

我正在处理我的应用程序中的一个棘手错误。我有一个聊天 View Controller ,用于处理键盘的显示和隐藏。但奇怪的是将应用程序置于后台时。

这是进入后台(点击主页按钮)之前的 View Controller

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

此外,我在 viewDidLoad 上设置了 self.definesPresentationContext = YES;

谁能告诉我发生了什么事?

谢谢

最佳答案

我以前也遇到过类似的问题。问题是当键盘根据其框架出现/消失时 tableView 的大小调整。 我所做的是在 tableView 的底部和 superView 之间设置一个约束,然后随着键盘的出现/消失来更改其常量。

您可以使用监听 UIKeyboardWillChangeFrameNotification 并按如下方式处理它,而不是依赖 keyboardWillShowWithRect:keyboardWillDismissWithRect:

- (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] 用于 View 显示整个动画

关于ios - 应用程序从后台返回时黑屏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42444134/

相关文章:

objective-c - 如何停止执行选择器?

ios - 背景 View Controller 中的 AVPlayer 缓冲视频导致内存问题

iphone - 添加到 uitableviewcontroller.view 的 UIPickerView 不会旋转

objective-c - 找不到实例方法 - 对于应用程序委托(delegate)属性

iphone - NSMutableArray 问题 - iPhone

iphone - 将更新的 iPhone 应用程序发布到 App Store 的说明是什么?

ios - 子类化 UICollectionViewLayoutAttributes

c# - Monotouch 自动增量内部版本号及版本号

ios - 检测具有不同主要值和次要值的 iBeacon

iphone - 为文本字段显示 uipicker 而不是键盘