将可点击和固定的子视图添加到UITableViewController?

时间:2012-11-29 21:05:21

标签: ios static uitableview subview adbannerview

我想将ADBannerView对象静态放置在我的UITableView屏幕上,这意味着我希望它始终保持在我的工具栏上方(self.navigationController.toolbar),即使用户正在滚动tableview。我已经通过将ADBannerView作为子视图添加到我的工具栏中来解决这个问题,并给出了帧原点的负值:

[self setBannerViewSize];
[self.navigationController.toolbar addSubview:bannerView];

唯一的问题是:我无法以这种方式点击并打开iAd - 我可以看到横幅,但点击它时没有任何反应。

由于我也使用了refreshControl,因此使用UIViewController而不是UITableViewController并手动添加tableView的选项对我来说不起作用。有没有其他方法可以让我的ADBannerView在我的表视图控制器中静态显示并且仍然可以点击?

谢谢你的建议!

3 个答案:

答案 0 :(得分:8)

耶!!毕竟我自己成功地解决了这个(非常烦人的)问题(并且大量阅读)!

首先,我发现这真的是world-changing post。基本上这个帖子处理的主题是UITableViewController使用self.view作为其tableView属性,因此覆盖tableView属性(或手动合成)以及给self.view一个新视图(来自应用程序)并添加tableView作为其子视图将使有可能到达tableView的真实的超级视图。

但这仍然没有解决我的问题,虽然我确信会这样,因为这一切都是有道理的。我的bannerView出现在正确的位置(并且已修复)但点击时仍然没有做任何事情。但是还有一件我不了解的小事:

当我在this post中阅读时,子视图的超级视图不仅必须是userInteractionEnabled,而且还具有不透明的backgroundColor。因为我的超级视图背景颜色被设置为[UIColor clearColor]所以它都没有用 - 但是将它的backGroundColor设置为例如blackColor解决了整个问题:bannerView终于可以点击了! :)

所以,我的代码现在看起来像这样:

@synthesize tableView;

- (void)viewDidLoad
{
    [super viewDidLoad];

    if (!tableView && [self.view isKindOfClass:[UITableView class]]) {
        tableView = (UITableView *)self.view;
    }

    self.view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame];
    self.tableView.frame = self.view.bounds;
    [self.view addSubview:self.tableView];

    [self resizeTableToFitBanner];
    self.view.backgroundColor = [UIColor whiteColor];
    [self.view addSubview:bannerView];

    // some other code
}

答案 1 :(得分:2)

Apple的iAdSuite示例代码中的BannerViewController非常优雅地解决了这个问题:

https://developer.apple.com/library/ios/samplecode/iAdSuite/Introduction/Intro.html

答案 2 :(得分:0)

我认为您应该使用容器视图,并在IB中进行设置。您可以将工具栏和ADBannerView添加到导航控制器根视图控制器视图的底部。使用容器视图填充剩余的空间 - 这将自动为您提供嵌入式视图控制器。您应该删除这个,然后在tableViewController中拖动并控制从容器视图拖动到tableViewController以挂接嵌入segue。