在uiscrollview中使用更改按钮实现uitableview

Posted

技术标签:

【中文标题】在uiscrollview中使用更改按钮实现uitableview【英文标题】:Implementing uitableview with change button inside uiscrollview 【发布时间】:2013-04-28 16:29:31 【问题描述】:

我查看了这些问题,但找不到我想要的确切内容。 UITableView and Another View inside ScrollView

Programmatically force a UIScrollView to stop scrolling, for sharing a table view with multiple data sources

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

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

所有这些都在 UIScrollView 中。

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

这可能吗? 谢谢!

【问题讨论】:

但是为什么你需要一个 UIScrollView?您所描述的是位于 UITableView 上方的分段控件 - 没有包含它们的 UIScrollView。 但在分段控件之上,我还有一些我想成为滚动条的控件。 【参考方案1】:

假设我理解您的要求,我会按以下方式执行此操作:

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

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

【讨论】:

第一节的表头怎么办?因为它会一直停留在视图的顶部。 现在不记得了,但可能是你必须实现 - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section,为第一部分指定高度 0 和高度第二个的分段控制。万一告诉我我更新了答案..【参考方案2】:

我已经实现了一个包含 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;

【讨论】:

以上是关于在uiscrollview中使用更改按钮实现uitableview的主要内容,如果未能解决你的问题,请参考以下文章

如何更改 UIScrollView Xcode 的 ContentOffSet

当 UIScrollView 在可见视图之外滚动按钮时更改 UIButton textLabel 位置

UIScrollView 在用户更改视图时卡住

UIScrollView 更改 contentOffset 时更改框架

为啥 uiscrollview 不显示 contentOffset 更改?

UIScrollView 显示为零?