页面应用程序 + 自动布局 + 子视图在滚动时缩放
Posted
技术标签:
【中文标题】页面应用程序 + 自动布局 + 子视图在滚动时缩放【英文标题】:Page application + Autolayout + Subviews scale while scrolling 【发布时间】:2012-11-29 16:56:34 【问题描述】:我已经在控制器上工作了 4 天,但我无法解决我的问题!
让我们来解释一下我的架构:
我有一个“Rootview”,其中包含一个 ScrollView 和 anImageView(它们都在 IB 中添加)
然后我有 4 个外部视图控制器。
我想要的是:将我的 4 个视图控制器放置在我的滚动视图中(这工作正常,两个视图都在代码中添加到我的滚动视图中)并允许用户在视图之间滚动
当我滚动时,我有一个小动画将我的视图缩放到 50%,然后将它们重新缩放到 100%。
当我在 IB 中禁用“自动布局”时,一切正常!我的动画和我的观点的位置。 但是,我不能禁用它,因为我希望我的应用可以在 iPhone4 和 iPhone5 上运行。
我不知道如何实施约束以正确定位我的所有视图。 我只是希望我的视图在高度上调整为 50 像素以适合 iPhone 4 屏幕。
这是我的 scrollViewConfiguration
- (void)configureScrollView
/* On déclare le nombre de page la scrollview */
if (self.myCurrentEvent.isEvent)
self.numberOfScrollViewPages = 2;
else
self.numberOfScrollViewPages = 4;
/* On initialise le tableau qui va contenir les tableviews */
viewControllersArray = [[NSMutableArray alloc] init];
/* Tant qu'on a pas atteint le nombre de pages de la scrollview */
for (unsigned i = 0; i < self.numberOfScrollViewPages; i++)
/* On ajoute NSNull au tableau de tableview */
[self.viewControllersArray addObject:[NSNull null]];
[self.myScrollView setTranslatesAutoresizingMaskIntoConstraints:NO];
/* On configure la content size en prenant la taille de la scroll view x le nombre de pages */
self.myScrollView.contentSize = CGSizeMake(self.myScrollView.frame.size.width * self.numberOfScrollViewPages, self.myScrollView.frame.size.height);
/* On désactive l'affichage du scroll horizontal */
self.myScrollView.showsHorizontalScrollIndicator = NO;
/* On désactive l'affichage du scroll vertical */
self.myScrollView.showsVerticalScrollIndicator = NO;
/* On désactive la fonction scroll to top */
self.myScrollView.scrollsToTop = NO;
/* On indique implémenter les fonction du son delegate */
self.myScrollView.delegate = self;
/* On affiche la première page */
[self loadScrollViewWithPage:0];
/* On affiche la deuxième page */
[self loadScrollViewWithPage:1];
if (!self.myCurrentEvent.isEvent)
[self loadScrollViewWithPage:2];
[self loadScrollViewWithPage:3];
- (void)loadScrollViewWithPage:(int)page
/* Si la page passée en paramètre est inférieure à 0, on sort de la fonction */
if (page < 0) return;
/* Si la page passée en paramètre est supérieur au nombre de page de la scrollview */
if (page >= self.numberOfScrollViewPages) return;
/* On récupère la référence vers la view contenu dans le tableau des tableview */
UIViewController *aViewController = [self.viewControllersArray objectAtIndex:page];
/* Si la vue récupérée est nulle */
if ((NSNull *)aViewController == [NSNull null])
switch (page)
case 0:
[self configureEventDescriptionViewController];
[self.viewControllersArray replaceObjectAtIndex:page withObject:self.myEventDescriptionViewController];
aViewController = self.myEventDescriptionViewController;
break;
case 1:
[self configureListOfContactViewController];
[self.viewControllersArray replaceObjectAtIndex:page withObject:self.myListOfContactViewController];
aViewController = self.myListOfContactViewController;
break;
case 2:
[self configureListOfExpensesCategoryViewController];
[self.viewControllersArray replaceObjectAtIndex:page withObject:self.myListOfExpensesCategoryViewController];
aViewController = self.myListOfExpensesCategoryViewController;
break;
case 3:
[self configureLinkContactViewController];
[self.viewControllersArray replaceObjectAtIndex:page withObject:self.myLinkContactViewController];
aViewController = self.myLinkContactViewController;
default:
break;
/* Si la superview de la vue est à nil */
if (aViewController.view.superview == nil)
[aViewController.view setTranslatesAutoresizingMaskIntoConstraints:NO];
CGRect frame;
frame.size.height = self.myScrollView.frame.size.height;
frame.size.width = 320;
frame.origin.x = page * 320;
frame.origin.y = 0;
[aViewController.view setFrame:frame];
/* On ajoute la vue courante à la scrollview */
[self.myScrollView addSubview:aViewController.view];
aViewController = nil;
我设置 viewController 框架的部分只有在我禁用自动布局时才有效
我希望你明白我想说什么......
对不起,我的英语不好......
普威尔
【问题讨论】:
【参考方案1】:不是最好的解决方案,但您可以有两个故事板,一个用于 4,一个用于 5。在应用程序委托中询问设备屏幕尺寸并加载适当的故事板。
同样,它不是最好的解决方案,但您也可以使用 .xib 使其工作。我不得不这样做,因为我无法绕过这些限制。
【讨论】:
是的...但是我有大约 15 个 .xib...我不想将此解决方案用于我的所有 .xib :(以上是关于页面应用程序 + 自动布局 + 子视图在滚动时缩放的主要内容,如果未能解决你的问题,请参考以下文章