【问题标题】:iOS7 Auto Layout, View Resize and iAdsiOS7 自动布局、视图调整大小和 iAds
【发布时间】:2013-12-16 07:49:34
【问题描述】:

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

主视图
-容器视图
---按钮
---按钮
---图像视图
- 横幅视图(iAd 横幅视图)

主视图和容器视图是屏幕的全宽和全高。我在容器视图上设置了水平和垂直空间约束,并保持在主视图(屏幕的高度和宽度)上。 Container 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 覆盖容器视图及其子视图的图像

【问题讨论】:

  • 使用自动布局时,千万不要直接设置框架。您需要通过修改或添加/减去约束来更改所有帧。
  • @rdelmar 所以我应该向隐藏的横幅视图添加新的约束并将容器视图底部约束编辑到新的横幅视图?谢谢,如果你能给我一个如何处理这个的例子,那就太好了! :)
  • 我不确定你在做什么。横幅视图是作为子视图添加的,还是从屏幕外移入?横幅视图的高度是固定的,还是可变的?什么是预览视图(是容器视图)?
  • @rdelmar 很抱歉更新了帖子是的,预览视图是容器视图。并且 Banner View 不是 Container View 的子视图,而是兄弟视图。我以编程方式创建横幅视图,并将其作为子视图添加到主视图中,因此我将其取消隐藏并将其移动到位。横幅视图确实有一个固定的高度。

标签: ios objective-c ios7 autolayout iad


【解决方案1】:

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

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

没有必要隐藏和取消隐藏视图,因为无论如何您最初都会将其放置在屏幕底部之外。还要确保在创建横幅视图后立即调用[bannerView setTranslatesAutoresizingMaskIntoConstraints:NO],否则在运行应用程序时会出现自动布局错误。

【讨论】:

  • 谢谢,我会试试你在这里提出的建议,然后回复它的进展情况。
  • 所以我用你的输入得到了这个,我唯一遗漏的是容器视图和横幅视图顶部之间的 0 长度约束,当我在运行时添加这个 xcode 错误时说有2 个冲突的约束,似乎是容器视图底部到主视图底部约束导致错误。
  • 谢谢,约束异常终于消失了!
  • @rdelmar:我面临同样的问题,但我在bannerview 上方有tableview。我无法理解横幅视图和主视图的长度约束如何为 0?
  • @rdelmar: 因为bannerview的顶部和mainview的底部不一样。
【解决方案2】:

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)]];

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

【讨论】:

  • 感谢您的输入帮助我从代码的角度对其进行了可视化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多