iOS7自动布局,视图调整大小和iAd

时间:2013-11-30 06:12:08

标签: ios objective-c ios7 autolayout iad

我在iOS 7项目中使用自动布局,具有以下视图层次结构

主视图
- 容器视图
---按钮
---按钮
--- ImageView的
-Banner View(iAd Banner View)

主视图和容器视图是屏幕的全宽和高度。我在容器视图上有水平和垂直空间约束,坚持主视图(屏幕的高度和宽度)。而且容器视图的子视图也被约束到具有20px空间的视图按钮。

当横幅视图最终被填充并放置在屏幕底部时,我的问题出现了,然后我让容器视图从其框架高度中减去横幅视图的高度,以便为横幅视图显示空间。 (下面使用的代码)理想的结果是容器视图根据这个新高度减去高度及其子视图约束更新,但最终发生的是iAD横幅视图,只是覆盖视图,如图所示。

BannerViewDidLoadAd的代码:

- (void)bannerViewDidLoadAd:(ADBannerView *)banner
{
    CGRect contentFrame = self.containerView.bounds;

    CGRect bannerFrame = self.bannerView.bounds;
    if (self.bannerView.bannerLoaded) {
        contentFrame.size.height = self.containerView.frame.size.height - self.bannerView.frame.size.height;

        bannerFrame.origin.y = contentFrame.size.height;;
    } else {
        bannerFrame.origin.y = contentFrame.size.height;
    }



    [UIView animateWithDuration:animated ? 0.25 : 0.0 animations:^{
        [self.containerView setFrame:contentFrame];
        [self.containerView layoutIfNeeded];
        self.bannerView.frame = bannerFrame;
        self.bannerView.hidden = NO;
    }];

    [self.containerView updateConstraints];
}

iAd覆盖容器视图及其子视图的图像

iad overlaying

2 个答案:

答案 0 :(得分:8)

在代码中创建横幅视图(并将其添加为主视图的子视图)后,应在容器视图的底部和横幅视图的顶部之间添加0长度间距约束(横幅视图)需要约束主视图的两侧和高度约束)。容器视图应该对主视图的所有四个边具有0个长度约束。您应该将IBOutlet设置为该底部约束,并将该约束的常量值设置为等于横幅视图高度的量(因此它将缩小,并且由于其0长度垂直间距约束,横幅视图将随之向上移动)。因此,如果底部约束的出口被称为bottomCon,并且横幅视图的高度为100磅,那么您将按照以下方式设置动画:

[UIView animateWithDuration:animated ? 0.25 : 0.0 animations:^{
        self.bottomCon.constant = 100;
        [self.mainView layoutIfNeeded];
    }];

无需隐藏和取消隐藏视图,因为无论如何您最初都会将其放在屏幕底部。另外,请确保在创建横幅视图后立即致电[bannerView setTranslatesAutoresizingMaskIntoConstraints:NO],否则在运行应用时会出现自动布局错误。

答案 1 :(得分:3)

rdelmar的反应对我来说已经足够了,但我会添加一些东西。启用自动布局后,无需使用setAutoresizingMask设置横幅的大小:UIViewAutoresizingFlexibleWidth(iOS 6中不推荐使用currentContentSizeIdentifier)。只需创建横幅对象,然后使用rdelmar概述的程序将其固定到位,自动布局处理水平尺寸。

以下是我使用的约束:

// pin sides to superview
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[_bannerView]-0-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_bannerView)]];

// set height to a constant
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[_bannerView(==66)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_bannerView)]];

// pin contentView to bannerView with 0 length constraint
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[_contentView]-0-[_bannerView]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_contentView,_bannerView)]];

我担心设置高度限制因为横幅的高度会根据平台和/或方向而改变。但是我为高度限制设置的值似乎没有任何区别 - 横幅总是以正确的高度显示,所以我甚至不打扰设置它。我假设这是因为广告横幅的高度有内在的尺寸。