2

私はかなり長い間これに苦労してきました。Instagram の iOS アプリと同様のユーザー プロファイルを実装する必要があります。

ここに画像の説明を入力

そのタブバーの最初のボタンをクリックすると、その下のすべてのコンテンツが変更されます。下部に表示されるテーブルビューは動的サイズであるため、それも考慮されます。

上部が 5 つのボタンを持つ UIView であり、それらに基づいて下部 (魔女はコンテナー ビューのようなもの) がコンテンツを変更する実装があります。これら 2 つ (上部の uiview と下部のコンテナー ビュー) は UIScrollView の一部です。しかし、この方法では、UIScrollViewのサイズを変更するために下部に表示したいテーブルビューのサイズに関する情報を時間内に戻すことができません。そして、これは欠陥のある方法だと感じています。この相互作用の王様を実装する方法についてのアイデアを本当に感謝します。ありがとうございました。

4

3 に答える 3

0

この答えが1年以上遅れていることは知っていますが、後で他の誰かに役立つかもしれない場合に備えて、私の仮説を述べたいと思いました. 私は同様の見解を実行し、この結論に達しました。私が間違っている場合は、誰でも私を訂正してください。

おそらくトップ ビューはヘッダー ビューであり、コレクション ビューとテーブル ビューのように見える 2 つのオプションは両方ともコレクション ビューであると思います。

コレクション ビューのレイアウトは細部まで細かく調整できるため、テーブル ビューのように見えるビューは、まさに特別に設計されたコレクション ビューだと思います。また、ビューを切り替えると、コレクション ビューのデータとプロパティがスワップされ、再ロードされます。

于 2014-08-01T05:49:28.200 に答える
0

選択した表示モードに応じて、UITableView または UICollectionView の headerView だと思います。ボタンの 1 つをタップすると、UITableView が UICollectionView に、またはその逆に変更されます。

表示されている方の現在の contentOffset を追跡し (UICollectionView と UITableView はどちらも UIScrollView のサブクラスであるため、両方からこれを取得できます)、切り替え先のビューに contentOffset を設定します。

UIView ヘッダー サブクラスの ivar をセットアップして、簡単に再利用できるようにします。

于 2013-01-29T14:54:58.723 に答える
0

これは私が持っているものです。私の問題は、後者のスクロールビューのサイズを変更するために、テーブルビューコントローラーから UserProfileViewController にテーブルビューのフレームの高さを有用な時間に戻すことです。また、どういうわけかこれを逆方向に行っていると感じているので、どんな提案も大歓迎です。

このビューには、上部と下部の 2 つの部分があります。親ビューはスクロール ビューです。これで達成したかったのは、下部に表示される内容を制御する一種のタブバーを上部に配置することです。

左上のボタンを押して別のビューを表示すると、上部にフリップ アニメーションが表示されます。これを実現する方法は、ダミー ビューと背面ビューの 2 つのビューを使用することです。ダミー ビューには、子としての正面図があります。フロント ビューは、すべてのボタンを含むビューです。このアニメーションのコードは、次のようにして実現されます。

- (IBAction)infoButtonPressed:(id)sender
{
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:1.0];
    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:self.hoverView cache:YES];

    if ([self.headerView superview]) {

        [self.headerView removeFromSuperview];
        [self.hoverView addSubview:self.backOfHeaderView];
        [self.infoButton removeFromSuperview];
        [self.backOfHeaderView addSubview:self.infoButton];

    } else {

        [self.backOfHeaderView removeFromSuperview];
        [self.hoverView addSubview:self.headerView];
        [self.infoButton removeFromSuperview];
        [self.headerView addSubview:self.infoButton];

    }
    [UIView commitAnimations];
}

下部は、プレース ホルダーとして機能するコンテナー ビューから作成されます。ボタンを押すと、別のビュー コントローラーがコンテナー ビューに表示されます。

各ビュー コントローラーには、独自のコンテナー ビューがあります。コントローラーが読み込まれると、そのビュー コントローラー (テーブルビュー) の特定のビューがコンテナー ビューに追加されます。また、テーブルビューがコンテナー ビューに既に追加されている場合は、それが削除されることも確認します。これはすべて、特定のビュー コントローラーごとに行われます。

ユーザー プロファイル ビューのビュー コントローラーには、コンテナー ビューのインスタンスと、プレースホルダーとしても機能する UIViewController の 1 つがあります (以降は currentViewController という名前になります)。特定のボタンが押されると、表示したいView Controllerのインスタンスがすでに存在するかどうかがチェックされます。そうでない場合は、それを作成し、そのテーブルビューのフレームをコンテナー ビューの境界に設定します。その後、スーパービューから currentViewController のビューを削除し、親ビューコントローラーから currentViewController 自体を削除して、これらに何かが割り当てられている場合、それらが存在しないことを確認します。次に、目的のビューコントローラーを currentViewController に割り当てます。また、目的のビューコントローラーを割り当てます。親ビューコントローラ(ユーザープロファイルビューコントローラ)のコンテナビューへのcontainerViewインスタンス。最後に、目的のビュー コントローラーを子としてメイン ビュー コントローラー (ユーザー プロファイル ビュー コントローラー) に追加し、目的のビュー コントローラーのビューをメイン ビュー コントローラーの containerView に追加します。これは、ボタンの 1 つのコードです。

    //Check if there is an instance of the viewcontroller we want to display. If not make one and set it's tableview frame to the container's view bounds
    if(!_userWallViewController) {
        self.userWallViewController = [[WallViewController alloc] init];
//        self.userWallViewController.activityFeedTableView.frame = self.containerView.bounds;

    }

    [self.userWallViewController.containerView addSubview:self.userWallViewController.activityFeedTableView];
    //If the currentviewcontroller adn it's view are already added to the hierarchy remove them
    [self.currentViewController.view removeFromSuperview];
    [self.currentViewController removeFromParentViewController];

    //Add the desired viewcontroller to the currentviewcontroller
    self.currentViewController = self.userWallViewController;

    //Pass the data needed for the desired viewcontroller to it's instances
    self.userWallViewController.searchURLString = [NSString stringWithFormat:@"event/user/%@/", self.userID];
    self.userWallViewController.sendCommentURLString = [NSString stringWithFormat:@"event/message/%@", self.userID];

    self.userWallViewController.totalCellHeight = ^(float totalCellHeight){

        self.userWallViewController.numberOfCells = ^(float numberOfCells){
            NSLog(@"The total number of cells: %f", numberOfCells);
            NSLog(@"The total cell height: %f", totalCellHeight);

            self.scrollView.contentSize = CGSizeMake(320.0, totalCellHeight + 172.0 + 33.0);
            CGRect newFrame = self.userWallViewController.containerView.frame;
            newFrame.size.height = totalCellHeight + 33.0;
            self.userWallViewController.containerView.frame = newFrame;

            NSLog(@"Container view: %f", self.containerView.frame.size.height);
            NSLog(@"Scroll view: %f",self.scrollView.contentSize.height );
        };
    };

    //Add this containerview to the desired viewcontroller's containerView
    self.userWallViewController.containerView = self.containerView;

    //Add the needed viewcontroller and view to the parent viewcontroller and the containerview
    [self addChildViewController:self.userWallViewController];
    [self.containerView addSubview:self.userWallViewController.view];

    [self performSelector:@selector(changeScrollView) withObject:self afterDelay:0.5];

    //CLEAN UP THE CONTAINER VIEW BY REMOVING THE PREVIOUS ADDED TABLE VIEWS
    [self.userFansViewController.userSimpleTableView removeFromSuperview];
    [self.fanOfViewController.userSimpleTableView removeFromSuperview];
    [self.userPublishedMovellaListViewController.gridView removeFromSuperview];

    [self.userPublishedMovellaListViewController removeFromParentViewController];
    self.userPublishedMovellaListViewController = nil;
}
于 2013-02-04T08:53:11.580 に答える