uitableview与标题如instagram用户个人资料

时间:2013-01-29 14:38:00

标签: ios uitableview uiscrollview instagram

我一直在努力解决这个问题。 我必须实现类似于Instagram在其ios应用程序中的用户配置文件。

enter image description here

当点击该标签栏上的第一个按钮时,所有内容向下都会发生变化。底部显示的tableview具有动态大小,因此他们也会考虑到这一点。

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

3 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

这就是我所拥有的。我的问题是,我很快回到有用的时间,从tableview控制器到UserProfileViewController的tableview的帧高度,以便改变后者的scrollview大小。我也觉得我在某种程度上倒退了所以任何建议都非常受欢迎。

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

当按下左上按钮以显示另一个视图时,上半部分有一个翻转动画。 实现这一目标的方法是通过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的框架设置为容器视图的边界。之后,它将从superview和currentViewController本身从父视图控制器中删除currentViewController的视图,以确保如果有分配给它们的东西,它们将不在那里。然后它将所需的viewcontroller分配给currentViewController。它还将所需的viewcontroller的containerView实例分配给父视图控制器(User Profile viewcontroller)中的containerview。最后,它会将所需的viewcontroller作为子项添加到主viewcontroller(User Profile viewcontroller),并将所需的viewcontroller视图添加到主viewcontroller的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;
}

答案 2 :(得分:0)

我知道这个答案已经晚了一年多了,但是我想在此陈述我的假设......只是因为它可能会帮助别人。我实施了类似的观点并得出了这个结论。如果我错了,欢迎任何人纠正我。

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

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