UITableView比UIPageView内的屏幕更大

时间:2014-08-25 10:44:08

标签: ios objective-c uitableview uiscrollview uipageviewcontroller

最近因为这个原因,我把头发拉了出来。我还是一名新手iOS开发者,因此我们非常感谢一个简单的解决方案。

我有一个带有三个视图的UIPageViewController,中间视图是一个UITableView,我以编程方式填充数据并尝试制作像网格一样的布局。当UITableView有太多数据时,信息会在屏幕之外。

enter image description here

我尝试禁用自动布局并将UITableView添加到UIScrollView,使UITableView能够水平滚动。我设法做到了这一点,但不知何故,交互是混乱的,大多数时候,当尝试水平滚动表时,它捕获UIPageViewController交互。桌子的垂直滚动也没有很好的反应。

这种情况有没有已知的解决方案?

1 个答案:

答案 0 :(得分:0)

在测试了一些事情后,我最终得到了一个使用autolayout的可接受的解决方案。

首先,我添加了一个UIScrollView,并在UIScrollView中添加了UITableView。 我已启用分页并在UIScrollView中禁用水平弹跳。

在UITableView中,我基本上禁用了与弹跳分页和滚动相关的所有内容。

由于数据以编程方式填充为某种网格,我必须知道最长行的总宽度,我已经创建了一些方法来计算最大宽度并排列标签。

我还为表格Width和Height创建了约束,我在计算完毕后计算并更新了这些约束。

-(void) ArrangeTable
{
    for (int i= 0; i < [arrayTable count]; i++) {
        for (int j=0; j< [[arrayTable objectAtIndex:i ] count]; j++) {
            UILabel * nameLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 8.0, 95.0, 30.0)];
            [nameLabel setText:[NSString stringWithFormat:@"%@",[[arrayTable objectAtIndex:i] objectAtIndex:j]]];
            [nameLabel sizeToFit];

            float widthIs = [nameLabel.text
                         boundingRectWithSize:nameLabel.frame.size
                         options:NSStringDrawingUsesLineFragmentOrigin
                         attributes:@{ NSFontAttributeName:nameLabel.font }
                         context:nil].size.width;
            [self alignLabels:j currentWidth:[NSNumber numberWithFloat: widthIs]];
        }
    }
}

-(void) alignLabels:(int)colNumber currentWidth:(NSNumber*)labelWidth
{
    if(colNumber >= [arrayLabelWidth count])
    {
        //Insert without position
        [arrayLabelWidth addObject:labelWidth];

    }else if ([labelWidth floatValue] > [[arrayLabelWidth objectAtIndex:colNumber] floatValue] )
    {
        [arrayLabelWidth replaceObjectAtIndex:colNumber withObject:labelWidth];
    }
}

-(void) setMaxRowWidth
{
    float widthTV =[[arrayLabelWidth valueForKeyPath:@"@sum.self"] floatValue] + ([arrayLabelWidth count]) * 10;
    CGRect screenRect = [[UIScreen mainScreen] bounds];
    float heightTV = [self tableViewHeight];

    if(widthTV > screenRect.size.width)
    {
        tvWidth.constant =  widthTV;
        //svWidth.constant = valueTV;
    }else{
        if (UIDeviceOrientationIsPortrait(self.interfaceOrientation)){
            //DO Portrait
            tvWidth.constant =  screenRect.size.width;
        }else{
            //DO Landscape
            float calc = screenRect.size.width - self.view.frame.size.width;
            tvWidth.constant =  screenRect.size.width - calc;
        }
    }
    tvHeight.constant = heightTV;

}

- (CGFloat)tableViewHeight
{
    [tablePod layoutIfNeeded];
    return [tablePod contentSize].height;
}