0

我查看了这些问题,但找不到我想要的。 UITableView 和 ScrollView 中的另一个视图

以编程方式强制 UIScrollView 停止滚动,以便与多个数据源共享表格视图

我正在尝试执行以下操作:在 UIScrollView 中,有一个带有几个控制器的 UIView。

在它们下面,类似于 UISegmentedControl。下面应该是 UITableView。UISegmentedControl 会切换 UITableView 的内容。

所有这些都在 UIScrollView 中。

我想要实现的是当我向下滚动时,我希望 UISegmentedControl 保持在视图的顶部。如果我继续向下滚动,只会滚动 UITableView 的内容。

那可能吗?谢谢!

4

2 回答 2

1

假设我了解您的要求,我将通过以下方式执行此操作:

  1. 使用一个带有两个部分的 UITableView
  2. 将“一对控制器”放在表格的第一部分。由您决定(无论是在单个单元格中还是在其他任何地方)。您只需要指示 UITableViewDataSource 在它请求第一部分的内容时返回这些控件
  3. 在 UITableViewDelegate 方法
    (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
    中,如果 section 为1,构建一个包含分段控件的视图并返回它
  4. 每当向数据源询问第二部分的内容时,检查分段控件的状态并返回正确的数据
  5. 每当分段控件发生变化时,捕获事件并重新加载表格视图。这样,第 4 步将提供在第二部分显示的新数据,并且表格将更改内容

这里的技巧是 UITableView 部分标题在滚动时会粘在表格的顶部,因此您将准确地实现您正在搜索的内容。表格的第一部分将滚开,分段控制器将粘在顶部,而第 2 部分将继续在其下方滚动。

于 2013-04-28T17:00:05.457 回答
0

我已经实现了一个包含 2 个部分的 UITableView。第一部分没有标题,标题的高度为 0。

第一部分的第一个也是唯一一个单元格是我想要滚动的 UIView(红色背景)。第二部分的标题是 UISegmentedControl(绿色背景)。

- (void)viewDidLoad {
    [super viewDidLoad];

    data = [[NSArray alloc] initWithObjects:@"1", @"2", @"3", @"4", @"5", @"6",@"7", @"8", @"9",@"10",nil];

    table = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height) style:UITableViewStylePlain];

    table.delegate = self;
    table.dataSource = self;

    [self.view addSubview:table];
}

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section 
{
    //Return zero for the first section's header.
    if (section == 0)
        return 0;
    return 20;
}

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    //Return nil for the first section's header view.
    if (section == 0) return nil;

    head1 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 20)];
    head1.backgroundColor = [UIColor greenColor];

    return head1;
}

- (NSInteger) numberOfSectionsInTableView:(UITableView *)tableView
{
    return 2;
}

- (NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    if (section == 0) return 1;

    return data.count;
}

- (UITableViewCell*) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    //First section - put the UIView that will be scrollable
    if (indexPath.section == 0)
    {
        static NSString *CellIdentifier = @"ControlCell1";

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

        head = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 44)];
        head.backgroundColor = [UIColor redColor];
        [cell.contentView addSubview:head];

        return cell;
    }

    static NSString *CellIdentifier = @"ControlCell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }   
    cell.textLabel.text = [data objectAtIndex:indexPath.row];
    return cell;
}
于 2013-04-29T05:50:02.790 回答