页面应用程序 + 自动布局 + 子视图在滚动时缩放

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 :(

以上是关于页面应用程序 + 自动布局 + 子视图在滚动时缩放的主要内容,如果未能解决你的问题,请参考以下文章

swift - 如何在多个页面中快速缩放图像

带有自动布局的新子视图的 iOS 7+ 缩放动画

滚动视图不在自动布局中滚动子视图

如何在 iOS 的分页滚动视图中缩放图像?

带有自动布局的滚动视图表单

垂直自动布局子视图