SlackTextViewController 扩展视图控制器:实现分屏与 iPad 适配

SlackTextViewController 扩展视图控制器:实现分屏与 iPad 适配

【免费下载链接】SlackTextViewController ⛔️**DEPRECATED** ⛔️ A drop-in UIViewController subclass with a growing text input view and other useful messaging features 【免费下载链接】SlackTextViewController 项目地址: https://gitcode.com/gh_mirrors/sl/SlackTextViewController

在移动应用开发中,iPad 的大屏幕为多任务处理提供了丰富的可能性。然而,要充分利用这一优势,开发者需要解决视图控制器在分屏模式下的布局适配、键盘交互等问题。SlackTextViewController 作为一款成熟的消息输入组件,提供了灵活的扩展机制来实现 iPad 分屏适配。本文将从场景需求出发,详细介绍如何通过官方示例和 API 实现分屏布局、动态调整及键盘优化。

分屏适配的核心需求与挑战

iPad 用户在消息应用中常需要一边查看内容一边输入文本,这要求视图控制器能够:

  • 在分屏模式下保持输入框可见且可交互
  • 根据屏幕尺寸动态调整布局元素
  • 处理键盘弹出时的视图偏移

SlackTextViewController 的 Examples/Messenger-iPad-Sheet/AppDelegate.m 示例展示了如何通过模态表单实现类似效果。关键代码如下:

MessageViewController *messageVC = [MessageViewController new];
UINavigationController *navVC = [[UINavigationController alloc] initWithRootViewController:messageVC];
navVC.modalPresentationStyle = UIModalPresentationFormSheet;
[self.window.rootViewController presentViewController:navVC animated:YES completion:^{
    [messageVC presentKeyboard:YES];
}];

这段代码通过设置 UIModalPresentationFormSheet 模态样式,使消息控制器以表单形式呈现,适合在分屏场景中作为独立面板存在。

视图控制器的分屏布局实现

基础配置与视图层级

SlackTextViewController 的核心布局由三部分组成:

  • 内容区域(UITableView/UICollectionView)
  • 文本输入栏(SLKTextInputbar)
  • 键盘交互层

在分屏模式下,需要确保输入栏始终位于可见区域。通过 Source/SLKTextViewController.h 中定义的 textInputbar 属性,可访问输入栏并调整其约束:

// 动态调整输入栏底部约束
self.textInputbar.bottomConstraint.constant = 16; // 分屏时增加边距
[self.textInputbar layoutIfNeeded];

分屏状态检测与响应

通过重写 viewWillTransitionToSize:withTransitionCoordinator: 方法,可监听分屏模式切换并调整布局:

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {
    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
    
    BOOL isSplitScreen = size.width < [UIScreen mainScreen].bounds.size.width;
    self.tableView.contentInset = UIEdgeInsetsMake(0, 0, isSplitScreen ? 80 : 40, 0);
    
    // 调整自动完成视图高度
    if (self.isAutoCompleting) {
        [self showAutoCompletionView:YES];
    }
}

该方法在屏幕尺寸变化时触发,可根据宽度判断是否处于分屏状态,并调整表格视图内边距和自动完成视图。

键盘交互优化

在分屏模式下,键盘弹出可能导致输入栏被遮挡。SlackTextViewController 提供了 keyboardPanningEnabled 属性和相关回调来解决此问题:

键盘事件监听

通过 Source/SLKTextViewController.h 中定义的 didChangeKeyboardStatus: 方法,可监听键盘状态变化:

- (void)didChangeKeyboardStatus:(SLKKeyboardStatus)status {
    [super didChangeKeyboardStatus:status];
    
    if (status == SLKKeyboardStatusDidShow) {
        // 键盘显示时检查是否处于分屏模式
        if (self.view.frame.size.width < [UIScreen mainScreen].bounds.size.width) {
            [self.scrollView setContentOffset:CGPointMake(0, self.scrollView.contentSize.height) animated:YES];
        }
    }
}

键盘滑动手势优化

启用 keyboardPanningEnabled 后,用户可通过滑动手势收起键盘,这在分屏模式下尤为重要:

self.keyboardPanningEnabled = YES; // 启用键盘滑动
self.shouldScrollToBottomAfterKeyboardShows = NO; // 分屏时禁用自动滚动到底部

高级特性:自定义输入栏与动态调整

输入栏高度自适应

SlackTextViewController 的输入栏会根据文本内容自动调整高度,在分屏模式下可通过重写 textView:shouldChangeTextInRange:replacementText: 方法进一步优化:

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
    BOOL result = [super textView:textView shouldChangeTextInRange:range replacementText:text];
    
    // 分屏时限制最大高度
    if (self.isSplitScreen) {
        self.textInputbar.maxHeight = 120; // 默认180
    }
    
    return result;
}

分屏专用工具栏

Examples/Messenger-Shared/MessageViewController.m 示例中,通过 configureActionItems 方法添加了分屏模式专用工具按钮:

- (void)configureActionItems {
    UIBarButtonItem *splitScreenItem = [[UIBarButtonItem alloc] initWithTitle:@"分屏" 
                                                                       style:UIBarButtonItemStylePlain 
                                                                      target:self 
                                                                      action:@selector(toggleSplitScreen:)];
    self.navigationItem.rightBarButtonItems = @[splitScreenItem, ...];
}

分屏模式下的用户体验优化

输入栏自动隐藏/显示

通过 Source/SLKTextViewController.h 中的 setTextInputbarHidden:animated: 方法,可实现输入栏的自动隐藏,为内容区域腾出空间:

// 滚动时隐藏输入栏
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
    if (self.isSplitScreen && !self.textView.isFirstResponder) {
        [self setTextInputbarHidden:YES animated:YES];
    }
}

动态字体与内容适配

SlackTextViewController 支持动态字体大小调整,在分屏模式下可进一步优化可读性:

// 响应动态字体变化
- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection {
    [super traitCollectionDidChange:previousTraitCollection];
    
    if (self.traitCollection.preferredContentSizeCategory != previousTraitCollection.preferredContentSizeCategory) {
        self.tableView.rowHeight = UITableViewAutomaticDimension;
        [self.tableView reloadData];
    }
}

完整实现示例与效果展示

以下是分屏适配的完整实现效果,左侧为内容浏览,右侧为消息输入面板:

分屏模式效果

该效果通过组合以下技术实现:

  1. 模态表单样式基础布局
  2. 动态约束调整
  3. 键盘事件监听
  4. 滚动手势响应

关键代码路径:

总结与扩展建议

通过 SlackTextViewController 实现 iPad 分屏适配,核心在于利用其提供的布局灵活性和键盘交互机制。开发者可根据实际需求进一步扩展:

  • 结合 UISplitViewController 实现主从式分屏
  • 通过 SLKTextInputbar 的自定义视图功能添加分屏控制按钮
  • 利用 SLKTypingIndicatorView 实现分屏模式下的输入状态指示

SlackTextViewController 的模块化设计使得分屏适配无需大规模修改现有代码,通过合理利用其提供的 API 和示例,即可快速实现专业级的 iPad 分屏体验。

【免费下载链接】SlackTextViewController ⛔️**DEPRECATED** ⛔️ A drop-in UIViewController subclass with a growing text input view and other useful messaging features 【免费下载链接】SlackTextViewController 项目地址: https://gitcode.com/gh_mirrors/sl/SlackTextViewController

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值