我在iOS 7项目中使用Auto Layout,具有以下视图层次结构
主视图
– 集装箱视图
—按钮
—按钮
— 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覆盖容器视图及其子视图的图像
解决方法
在代码中创建横幅视图(并将其添加为主视图的子视图)后,应在容器视图的底部和横幅视图的顶部之间添加0长度间距约束(横幅视图需要约束主视图的两侧和高度约束也是如此).容器视图应该对主视图的所有四个边具有0个长度约束.您应该将IBOutlet设置为该底部约束,并将该约束的常量值设置为等于横幅视图高度的量(因此它将缩小,并且由于其0长度垂直间距约束,横幅视图将随之向上移动).因此,如果底部约束的出口被称为bottomCon,并且横幅视图的高度为100个点,那么您将按照以下方式设置动画:
[UIView animateWithDuration:animated ? 0.25 : 0.0 animations:^{ self.bottomCon.constant = 100; [self.mainView layoutIfNeeded]; }];
无需隐藏和取消隐藏视图,因为无论如何您最初都会将其放在屏幕底部.还要确保在创建横幅视图后立即调用[bannerView setTranslatesAutoresizingMaskIntoConstraints:NO],否则在运行应用程序时会出现自动布局错误.