水平的UITableView

问题描述:

我想实现我的iPad应用程序中的布局具有uitable观点,即滚动左右而不是上下:水平的UITableView

因此,而不是

行1个 行2 排3 (垂直滚动) 这将是: 第1行,2行,3行 (水平滚动)

我见过的UITableView设计只做垂直滚动这样的变换也没有达到预期的效果。有没有一种标准的方式来利用像uitableview提供的数据源提供程序的优势?
我基本上想做一些类似于ipad上的BBC News reader app所做的事情,以及可供选择的故事列表。

感谢

现在你必须使用的UIScrollView和集中滚动只到水平位置。至于你需要处理的数据你自己的出库和优化。如果您不希望超过十几个对象,那么您可以跳过它,但是如果它们是数据密集型的,则尝试实施类似于UITableView使用的数据源和加载。请注意,英国广播公司新闻阅读器应用程序还使用启用分页功能来滚动每个'页面(4左右新闻图标)'。

此问题已被answered by apple。通过苹果滚动示例

演示如何实现两个 不同风格的UIScrollViews。第一个卷轴包含多个 图像,显示如何使用多个数据块 (在我们的情况下为5个单独的UIImageView)来布置大型 内容。

这也适用于iPad。

+1

死的资源链接:( – ULazdins 2016-12-20 07:37:28

+0

该示例代码是太旧,你仍然可以访问HTTPS: //web-beta.archive.org/web/20100805074840/developer.apple.com:80/iphone/library/samplecode/Scrolling/Listings/ReadMe_txt.html – 2016-12-20 12:56:12

我已经发布了示例代码,演示了使用变换实现水平滚动表视图的一种方法。它被称为EasyTableView并为垂直和水平滚动表视图提供相同的界面。

+0

伟大的代码! – 2012-02-09 17:57:53

+0

奇妙的代码位,很好的一个! – 2013-01-05 17:11:09

这是我使用的方法:

1)为实现你的UITableView的自己的子类,并覆盖其initWithCoder:方法如下图所示:

- (id)initWithCoder:(NSCoder *)aDecoder 
{ 
    assert([aDecoder isKindOfClass:[NSCoder class]]); 

    self = [super initWithCoder:aDecoder]; 

    if (self) { 

     const CGFloat k90DegreesCounterClockwiseAngle = (CGFloat) -(90 * M_PI/180.0); 

     CGRect frame = self.frame; 
     self.transform = CGAffineTransformRotate(CGAffineTransformIdentity, k90DegreesCounterClockwiseAngle); 
     self.frame = frame;  

    } 

    assert(self); 
    return self; 
} 

2)创建自己的UITableViewCell类,并覆盖initWithCoder:再次:

- (id)initWithCoder:(NSCoder *)aDecoder 
{ 
    assert([aDecoder isKindOfClass:[NSCoder class]]); 

    self = [super initWithCoder:aDecoder]; 

    if (self) { 

     const CGFloat k90DegreesClockwiseAngle = (CGFloat) (90 * M_PI/180.0); 

     self.transform = CGAffineTransformRotate(CGAffineTransformIdentity, k90DegreesClockwiseAngle); 
    } 

    assert(self); 
    return self; 
} 

3)现在,你可以创建IB一个UITableView元素,并将其类为“MyHorizo​​ntalTableView”在身份检查员。

4)在IB中创建您的UITableViewCell元素,并在身份检查器中将其类设置为“MyHorizo​​ntalTableViewCell”。

就是这样。

如果您不想使用IB来实例化您的表格视图或单元格,这也可以通过重写其他初始化器来工作。

A sample project我围绕这个概念构建的可以在GitHub中找到。

+3

不错,但有一个问题....如果我尝试在运行应用程序时调整表的大小,单元格将不会调整垂直。水平尺寸不是问题,因为有heightForRow Methode来自代表...但没有人与......并且在转换之后autoresize不会工作:-( – Raegtime 2012-08-02 15:16:57

+0

我需要完成所有这4个步骤? – 2014-02-25 12:09:32

+0

@OmerObaid - 还有其他方法可以实现相同的结果。您理论上可以覆盖其他初始化器。这只是一种方法。 – diegoreymendez 2014-02-26 15:02:33

如果您可以将您的应用限制为仅限iOS 6及更高版本,则最好的方法是使用UICollectionView

如果您需要支持iOS 4/5,请尝试UICollectionView的开源重新实现之一,例如。 PSTCollectionView

+0

你可以给我一些提示(链接或代码)关于如何做到这一点。我想我必须玩'UICollectionViewLayout'。任何帮助赞赏。谢谢! – Colas 2014-05-28 10:41:02

+0

你是对的;你会使用单行格子布局。 – JosephH 2014-05-28 15:08:55

+0

如何创建单行网格布局?到目前为止,我使用一个技巧:我要求两个元素之间有非常大的最小空间。 – Colas 2014-05-28 16:29:30

我写了一个简单的UIScrollView子类,喜欢的UITableView实现细胞的可重用性,该谟MMHorizontalListView在GitHub上,也有一个测试项目,所以你可以看到如何用一个例子使用它,它的工作原理也与老的iOS像4.x版本(可能更旧...)

有一个简单的绝妙技巧,让UITableView能够完成垂直和水平滚动。

你可以在有和没有自动布局的情况下做到这一点 - 我会用自动布局解释它。

在你UITableView有一个宽度约束和没有尾随对齐约束。 将此宽度约束与IBOutlet绑定,并在您的控制器中将以下设置设置为表视图上的属性。

let contentWidth = 1000 // you calculate that 
tableViewWidthConstraint.constant = contentWidth 
tableView.contentSize.width = (contentWidth * 2) - UIScreen.main.bounds.size.width 

的实现代码如下必须是全幅呈现在水平方向上的所有内容,以及我们与内容大小玩弄屏幕尺寸做的伎俩相比。

下面的下面的作品他们的位置,但你可以在生命周期尝试在不同的步骤:

override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 

    tableViewWidthConstraint.constant = contentWidth 
} 

override func viewDidAppear(_ animated: Bool) { 
    super.viewDidAppear(animated) 

    tableView.contentSize.width = (contentWidth * 2) - UIScreen.main.bounds.size.width 
} 

// and this is needed to support rotation: 
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { 
     coordinator.animate(alongsideTransition: { (UIViewControllerTransitionCoordinatorContext) -> Void in 
      self.tableView.contentSize.width = (contentWidth * 2) - UIScreen.main.bounds.size.width 
     }, completion: nil) 
    } 
    super.viewWillTransition(to: size, with: coordinator) 
}