7

2 つのセクション、最初のセクションに 1 行、2 番目のセクションに可変量の行を持つ UITableview があります。ユーザーがテーブルを上にスクロールすると (指が上に移動)、tableview はデフォルトの動作を行いますが、ユーザーが uitableview の上部にいて下にスクロールすると (指が下に移動)、最初のセルのように見えるはずです最初のセクションの高さは、ユーザーが下にスクロールするほど大きくなります (タッチを離すと、行の高さが元の高さの 100 に戻ります)。私は試した

-(void)scrollViewDidScroll:(UIScrollView*)scrollView{
    if(scrollView.contentOffset.y < 0){
        [mainTable reloadRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:0 inSection: 0]] withRowAnimation:UITableViewRowAnimationNone];
    }
}

-(CGFloat)tableView:(UITableView*)tableView heightForRowAtIndexPath:(NSIndexPath*)indexPath{
    if(indexPath.section == 0 && tableView.contentOffset.y < 0){
        return -tableView.contentOffset.y+100;//Default height is 100
    }
}

しかし、 reloadRows メソッドは contentOffset を 0 にリセットするので、プルダウンするとテーブルビューが途切れます。これが機能しない場合は、UIScrollView にすべてを書き込む必要があり、リサイクル可能なセルがないと非常に面倒なようです。

誰か提案はありますか?

4

1 に答える 1

9

行をリロードする必要はありません。フレームを直接変更しただけです。cell.layer.masksToBounds = YESに設定し、セル内のサブビューを元のセルの高さよりも大きくするようにしてください。

-(void)scrollViewDidScroll:(UIScrollView *)scrollView{
    if (mainTable.contentOffset.y < 0) {
        UITableViewCell *cell = [mainTable cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
        float rawr = mainTable.contentOffset.y;
        cell.frame = CGRectMake(cell.frame.origin.x, rawr, cell.frame.size.width, 100-rawr);
    }
}
于 2012-02-03T22:36:32.270 に答える