2

我已经为此苦苦挣扎了一段时间。我必须实现一个类似于 Instagram 在他们的 ios 应用程序中的用户配置文件。

在此处输入图像描述

当单击该选项卡栏上的第一个按钮时,所有向下的内容都会发生变化。底部显示的表格视图具有动态大小,因此他们也考虑到了这一点。

我已经实现了一些顶部是带有 5 个按钮的 UIView 并基于它们底部(女巫就像一个容器视图)更改内容的东西。而这两个(顶部 uiview 和底部容器视图)是 UIScrollView 的一部分。但是这样我就无法及时获得关于我想在底部显示的表格视图大小的信息,以便修改 UIScrollView 的大小。我有一种感觉,这是一种有缺陷的方法。我真的很感激任何想法哦如何实现这个交互之王。谢谢你。

4

3 回答 3

0

我知道这个答案已经晚了一年多,但我想就此陈述我的假设……以防它以后可能对其他人有所帮助。我实施了类似的观点并得出了这个结论。如果我错了,欢迎任何人纠正我。

我认为也许顶视图是标题视图,而看起来像集合视图和表格视图的两个选项都是集合视图。

因为集合视图的布局可以微调到最细微的细节,我认为看起来像表格视图的视图只是一个真正专门设计的集合视图。在视图之间切换时,集合视图的数据和属性正在交换和重新加载。

于 2014-08-01T05:49:28.200 回答
0

这就是我所拥有的。我的问题是,为了改变后者的滚动视图大小,我不想在有用的时间将 tableview 的框架高度从 tableview 控制器返回到 UserProfileViewController。我也觉得我在某种程度上是在倒退,所以任何建议都非常受欢迎。

此视图有两个部分:上部和下部。父视图是滚动视图。我想要实现的是在上部有一种标签栏,它将控制 waht 将出现在下部。

当按下左上角按钮以显示另一个视图时,上部有一个翻转动画。实现这一点的方法是拥有 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];
}

下部由充当占位符的容器视图制成。当按下按钮时,容器视图中会显示不同的视图控制器。

每个视图控制器都有自己的容器视图。当控制器加载时,该视图控制器(tableview)的特定视图被添加到它的容器视图中。它还确保如果 tableview 已经添加到容器视图中,它将被删除。所有这些都是在每个特定的视图控制器中完成的。

在 User Profile 视图的视图控制器中,有一个容器视图的实例和一个 UIViewController,它也充当占位符(从现在开始命名为 currentViewController)。当按下特定按钮时,它会检查我们想要显示的视图控制器的实例是否已经存在。如果不是,它将创建一个并将其 tableview 的框架设置为容器视图的边界。之后,它将从父视图控制器中删除 currentViewController 的视图,并从父视图控制器中删除 currentViewController 本身,以确保如果有分配给这些的东西,它们将不存在。然后它将所需的视图控制器分配给 currentViewController。它还分配所需的视图控制器' s containerView 实例到父视图控制器(用户配置文件视图控制器)中的容器视图。最后,它会将所需的视图控制器作为子视图添加到主视图控制器(用户配置文件视图控制器)中,并将所需的视图控制器的视图添加到主视图控制器的 containerView 中。这是其中一个按钮的代码:

    //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 回答
0

我相信它是 UITableView 或 UICollectionView 上的 headerView,具体取决于您选择的视图模式。当您点击其中一个按钮时,它会将 UITableView 更改为 UICollectionView,反之亦然。

您希望跟踪正在显示的内容的当前 contentOffset(UICollectionView 和 UITableView 都是 UIScrollView 的子类,因此您可以从两者中获取此内容),然后在要切换到的视图上设置 contentOffset。

为 UIView 标头子类设置一个 ivar,以便您可以轻松地重用它。

于 2013-01-29T14:54:58.723 回答