我一直在努力解决这个问题。 我必须实现类似于Instagram在其ios应用程序中的用户配置文件。
当点击该标签栏上的第一个按钮时,所有内容向下都会发生变化。底部显示的tableview具有动态大小,因此他们也会考虑到这一点。
我有一些实现,其中顶部是一个带有5个按钮的UIView,并且基于它们的底部(女巫就像一个容器视图)改变了内容。这两个(顶部uiview和底部容器视图)是UIScrollView的一部分。但是这样我无法及时获得有关tableview的大小的信息,我希望在底部显示,以便修改UIScrollView的大小。我觉得这是一个有缺陷的方法。 我真的很感激任何想法哦如何实现这个互动之王。谢谢。
答案 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)
我知道这个答案已经晚了一年多了,但是我想在此陈述我的假设......只是因为它可能会帮助别人。我实施了类似的观点并得出了这个结论。如果我错了,欢迎任何人纠正我。
我认为顶视图可能是标题视图,看起来像集合视图和表视图的两个选项都是集合视图。
因为集合视图的布局可以微调到最细微的细节,我认为看起来像表视图的视图只是一个真正专门设计的集合视图。在视图之间切换时,正在交换和重新加载集合视图的数据和属性。