我可以将页面视图控制器放在表格视图单元格中吗?

时间:2014-08-13 17:38:48

标签: ios objective-c uitableview uipageviewcontroller

我想知道是否可以在表格视图单元格中放置页面视图。基本上我试图让每个表格视图单元格能够向左/向右滚动以获得更多内容。

我可以通过在表格视图单元格中放置页面视图来实现吗?或者是否有另一种方法可以在表格视图单元格中向左/向右滑动?

3 个答案:

答案 0 :(得分:3)

可以加载另一个视图控制器并将其视图添加为另一个控制器视图的子视图。

虽然Apple的指南不推荐这样做:

  

您创建的每个自定义视图控制器对象都负责   管理单个视图层次结构中的所有视图。 [...]   视图控制器与视图之间的一对一对应关系   其视图层次结构是关键的设计考虑因素。你不应该使用   多个自定义视图控制器来管理不同的部分   相同的视图层次结构。

有关指南的更多信息,请点击here

更好的方法是使用UIScrollView和UIPageControl这样......

<强>的cellForRowAtIndexPath

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

    }    

    NSArray *photo = [NSArray arrayWithObjects:[UIImage imageNamed:@"image1.png"], [UIImage imageNamed:@"image2.png"], [UIImage imageNamed:@"image3.png"], nil];
    self.scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 320, 150)];
    self.scrollView.backgroundColor = [UIColor clearColor];
    self.scrollView.indicatorStyle = UIScrollViewIndicatorStyleBlack; //Scroll bar style
    self.scrollView.showsHorizontalScrollIndicator = NO;
    [self.scrollView setDelegate:self];
    //Show horizontal scroll bar

    self.scrollView.showsVerticalScrollIndicator = YES; //Close vertical scroll bar
    self.scrollView.bounces = YES; //Cancel rebound effect
    self.scrollView.pagingEnabled = YES; //Flat screen
    self.scrollView.contentSize = CGSizeMake(640, 30);

    NSLog(@"LOG");

    self.pageControl = [[UIPageControl alloc] initWithFrame:CGRectMake(0, 155, 320, 40)];
    self.pageControl.numberOfPages = photo.count;
    self.pageControl.currentPage = 0;
    self.pageControl.backgroundColor = [UIColor redColor];
    [self.pageControl setTintColor:[UIColor whiteColor]];
    [cell.contentView addSubview:self.pageControl];


    for(int i = 0; i < photo.count; i++)
    {
        CGRect frame;
        frame.origin.x = (self.scrollView.frame.size.width *i) + 10;
        frame.origin.y = 0;
        frame.size = CGSizeMake(self.scrollView.frame.size.width - 20, self.scrollView.frame.size.height);

        UIImageView *imageView = [[UIImageView alloc] initWithFrame:frame];
        [imageView setImage:[photo objectAtIndex:i]];


        [self.scrollView addSubview:imageView];
        self.scrollView.contentSize = CGSizeMake(self.scrollView.frame.size.width*photo.count, self.scrollView.frame.size.height);
    }

    [cell.contentView addSubview:self.scrollView];


    return cell;
}

更新PageControl

-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    CGFloat pageWidth = scrollView.frame.size.width;

    //int page = floor((scrollView.contentOffset.x - pageWidth*0.3) / pageWidth) + 1);

    self.pageControl.currentPage = (int)scrollView.contentOffset.x / (int)pageWidth;
    NSLog(@"CURRENT PAGE %d", self.pageControl.currentPage);
}

答案 1 :(得分:2)

是的,你可以。

但是,请注意,如果您选择使用该路线,则无法删除其中的页面控件的黑色背景。我几天前做了这个,但最终摆脱了页面视图控制器,转而使用支持分页和UIScrollView的{​​{1}}。我使用UIPageControl滚动视图委托方法来确定何时确定页面控件中的-scrollViewWillEndDragging:withVelocity:targetContentOffset:

如果您在滚动视图中拥有相当多的视图,那么使用集合视图而不是普通的滚动视图会更节省内存。

答案 2 :(得分:0)

尝试在单元格内放置另一个UITableview(逆时针方向旋转90度),而不是使用UIPageview。这样您就可以更好地控制触摸事件和更多自定义。

1)有一个UITableViewCell类和一个xib文件,比如PageViewTableCell

2)Xib文件在单元格内应该有一个UITableView

3)调用awakeFromNib时旋转表格

- (void)awakeFromNib
  {
      horizontalTable.transform = CGAffineTransformMakeRotation(-M_PI_2);
      horizontalTable.frame = CGRectMake(0,0,horizontalTable.frame.size.width,horizontalTable.frame.size.height);
  }

4)根据您的设计获得horizo​​ntalTable的委托和数据源。

5)加载具有上述自定义单元格的主表

- (void)viewDidLoad
{
    [self.mainTable registerNib:[UINib nibWithNibName:@"PageViewTableCell"
                                          bundle:[NSBundle mainBundle]]
    forCellReuseIdentifier:@"samplecell"];

}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    PageViewTableCell* cell = [tableView dequeueReusableCellWithIdentifier:@"samplecell"];
    return cell;
}