在 Table View Controller 中水平滚动 UITableView

Posted

技术标签:

【中文标题】在 Table View Controller 中水平滚动 UITableView【英文标题】:Scroll UITableView horizontal in Table View Controller 【发布时间】:2019-11-21 05:03:30 【问题描述】:

我有一个表视图控制器场景,它有一个表视图控制器,它有一个表视图,它有一个表视图单元格,它有一个内容视图,它有我的 3 个 UILabel。一切都好,它显示了我的数据,我可以上下滚动浏览我的数据。

但是,我的表格视图单元格中的数据比屏幕宽。我希望能够水平滚动整个表格,以便可以查看表格中的所有数据。我能够将 UIScrollView 添加到内容视图,然后每个单独的单元格都能够水平滚动,但数据是列式的,因此将其作为表格滚动更有意义。我知道 UITableView 无论出于何种原因都无法水平滚动,在这种情况下,将整个表格放入 UIScrollView 似乎是合理的。但是,似乎没有办法在 IB 中的 Table View 和 Table View Controller 之间插入 UIScrollView。

关于如何实现这个看似基本的功能工作有什么建议吗?我必须错过一些非常基本的东西。

【问题讨论】:

【参考方案1】:

我认为仅使用表格视图来实现您提到的内容并不容易。一种方法是将表格视图的每个单元格设置为具有水平滚动的集合视图。 Here's 一篇关于如何做到这一点的文章。

另一个选择是使用带有自定义流布局的集合视图,这样您就可以提供垂直和水平滚动。如果我没记错的话,你想要实现的是like that。它展示了如何做到这一点,但它有点老了,代码在 Objective-C 中。

另外,看看这个*** question,建议使用滚动视图和集合视图。

一般来说,在 *** 和网络上搜索一下。我发现很多网站/文章都在讨论这个话题,所以你一定会想出一个解决方案。

【讨论】:

感谢您的回复。您的第一个和第三个链接是不水平滚动整个表格但滚动单个单元格内容的解决方案。我能够通过将 UIScrollView 放入内容视图然后将我的标签添加到 UIScrollView 来实现这一点。您的第二个链接更像是我一直在寻找的解决方案,整个表格可以滚动,就像电子表格一样。最后我最终放弃了 UITableViewContoller 并使用 Quick Look 和 QLPreviewController 将我的数据作为 CSV 文件打开并允许水平和垂直滚动。【参考方案2】:

看来没有简单的方法可以让 UITableViewController 水平滚动。通过水平滚动我的意思是保持垂直滚动并添加水平滚动以查看数据元素比屏幕宽的 UITableViewCell 并将整个表格滚动为连贯表格的能力。我不想将 UITableView 转动 90 度,因此它会以垂直滚动为代价进行水平滚动,并且我不想单独滚动每个单元格中的数据。我遇到的 UITableView 解决方案与我所说的最相似的是here,但我没有实现这个解决方案。相反,我改变了我的整个方法并删除了一堆代码。因为我正在显示类似数据的电子表格,所以我创建了一个 CSV 文件并使用 Quick Look QLPreviewController 打开它。它打开文件并提供垂直和水平滚动,并允许用户保存或共享或通过电子邮件发送文件,这是我需要实现的其他东西,所以这个解决方案用 1 块石头杀死了众所周知的 2 只鸟,它非常简单。

在我的视图控制器中,我导入了 QuickLook.h 并采用了协议。

#import <UIKit/UIKit.h>
#import <QuickLook/QuickLook.h>

@interface MyTableViewController : UITableViewController <QLPreviewControllerDataSource>

@end

我在视图控制器中声明了 2 个属性

@interface TimersTableViewController ()
@property NSString *csvFile;
@property QLPreviewController *qlController;
@end

我的控制器中的协议实现是:

// quick look preview controller protocol methods.  there is only one file and it is the csv file
// this controller will allow the use to decide what they want to do with the file. DML 11/21/2019
- (NSInteger)numberOfPreviewItemsInPreviewController:(QLPreviewController *)controller 
    return 1;

- (id <QLPreviewItem>)previewController:(QLPreviewController *)controller previewItemAtIndex:(NSInteger)index 
     return [NSURL fileURLWithPath:self.csvFile];

然后我将我的数据写入一个文件并调用 QLPreviewController 来显示它。

- (void)setLogs:(NSArray<LogRecords *> *)logs
    _logs = logs;
    // allocate the quick look preview controller to display the csv file.  
    if (self.qlController == nil)
        self.qlController = [[QLPreviewController alloc] init];
        // set self as it's datasource
        self.qlController.dataSource = self;
    
    // get the path to the NSDocumentDirectory which
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    // the path I want is the first object in the array
    NSString *documentsDirectory = [paths objectAtIndex:0];
    // set the cvs file name
    self.csvFile = [NSString stringWithFormat:@"%@/%@", documentsDirectory,@"MyCSVFile.csv"];
    // use NSFileManaget to create the file because it needs to exist before it can be opened with NSFileHandle 
    NSFileManager *fm = [NSFileManager defaultManager];
    [fm createFileAtPath:self.csvFile contents:nil attributes:nil];
    NSFileHandle  *file = [NSFileHandle fileHandleForWritingAtPath:self.csvFile];
    // write the header to the csv file
    [file writeData:[@"date,time,message" dataUsingEncoding:NSUTF8StringEncoding]];
    // for my app I loop through the logs and write each of them to the file
    for (int i = 0; i < self.logs.count; i++)
        [file writeData:[[[self.logs objectAtIndex:i] toCsvString] dataUsingEncoding:NSUTF8StringEncoding]];
    
    [file closeFile];
    // make sure quick look preview controller gets latest csvFile 
    [self.qlController reloadData];
    // display the quick look preview controller
    [self presentViewController:self.qlController animated:YES completion:nil];

这一次解决了我的两个问题:水平滚动并允许用户访问文件以保存或共享它。

【讨论】:

以上是关于在 Table View Controller 中水平滚动 UITableView的主要内容,如果未能解决你的问题,请参考以下文章

在 Table View Controller 中水平滚动 UITableView

iOS 开发 - 如何使用自定义 Table View Controller 显示在 Interface Builder 中创建的静态单元格?

Xcode Table View Controller with Nav Controller 不显示表格单元格,而是处理单元格中的数据

Table View Controller 每行连接到不同的视图控制器

如何在 Xcode Interface Builder 中将导航项添加到 Table View Controller(带有静态单元格)?

在 Interface Builder 中创建的 Table View Controller 的底部单元格在 iPhone X 上被剪裁和隐藏