iAd ниже UITableViewController внутри UINavigationController - PullRequest
7 голосов
/ 25 марта 2012

Я создаю приложение для сайта блога.

У меня есть UINavigationController с UITableViewController в качестве его корневого представления.

Я выложил это в раскадровке без проблем, но яя пытаюсь перетащить представление iAd в нижнюю часть экрана, и xcode не позволяет мне добавить его.

Похоже, мне нужно переключиться с подкласса UITableViewController на подкласс UIViewController и просто поместитьмои методы делегата и источника данных в моем подклассе UIViewController.

Мне кажется, это неправильно.Я просто пытаюсь закончить с UITableView заголовков статей, с навигационной панелью вверху и iAd внизу ...

Совет?Предложения?

Заранее спасибо.

Ответы [ 3 ]

23 голосов
/ 25 марта 2012

Один из самых простых способов сделать это - использовать свойство UITableView tableFooterView. Да, я знаю, что нижний колонтитул остается внизу таблицы, но это не обязательно. Вы можете установить его рамку в таблице. Добавьте iAd в качестве нижнего колонтитула следующим образом:

self.tableView.tableFooterView = iAd; 

Затем, чтобы настроить кадр iAd при прокрутке таблицы, реализуйте метод делегата UIScrollView: (Это возможно, поскольку UITableView является подклассом UIScrollView)

-(void)scrollViewDidScroll:(UIScrollView *)scrollView{
    CGRect iAdFrame = iAd.frame;
    CGFloat newOriginY = table.contentOffset.y + table.frame.size.height - iAdFrame.size.height;
    CGRect newIAdFrame = CGRectMake(iAdFrame.origin.x, newOriginY, iAdFrame.size.width, iAdFrame.size.height);
    iAd.frame = newIAdFrame;
}

Вы можете видеть, что реализация достаточно проста. Мы просто используем contentOffset y, чтобы определить, насколько далеко должен быть вниз кадр iAd.

2 голосов
/ 27 октября 2013

Я пытался использовать приведенный выше пример NJones для корректировки положения tableFooterView, но я обнаружил, что им трудно управлять при перезагрузке данных или обновлении таблицы.

Затем я узнал, что это можно сделать, добавив баннер iAd к суперпредставлению представления tableViewController.

self.bannerViewController = [[BannerViewController alloc] init];
[self.bannerViewController.view setHidden:YES];
[self.bannerViewController.view setFrame:CGRectMake(0, self.view.superview.frame.size.height - self.tabBarController.tabBar.frame.size.height - 50, 320, 50)];

[self.view.superview addSubview:self.bannerViewController.view];
[self.bannerViewController loadBanner];

Когда баннер загружается, я создаю tableFooterView, чтобы освободить место для последней ячейки в tableViewController

-(void)bannerDidLoad{
     [self.bannerViewController.view setHidden:NO];
     self.tableView.tableFooterView = [[UIView alloc];
     initWithFrame:self.bannerViewController.view.frame];
 }
0 голосов
/ 20 октября 2015

Мне пришлось внести некоторые изменения в решение, опубликованное NJones, поскольку возникла проблема с тем, что объявление не показывалось поверх всех остальных ячеек / представлений.

Сначала убедитесь, что ваш tableViewController является AdBannerViewDelegate.:

@interface MyTableViewController () <ADBannerViewDelegate>

Добавление AdBanner в tableviewcontroller:

- (void)viewDidLoad {
    [super viewDidLoad];
    ...
    ADBannerView *adBanner = [[ADBannerView alloc]initWithAdType:ADAdTypeBanner];
    adBanner.delegate = self;
    self.tableView.tableFooterView = adBanner;
}

Код для размещения рекламного баннера взят из NJones, я добавил только последнюю строку, чтобы перенести рекламный баннер вfront:

-(void)positionAdBanner {
    ADBannerView *adBanner = (ADBannerView *) self.tableView.tableFooterView;
    if (adBanner) {
        CGRect iAdFrame = adBanner.frame;
        CGFloat newOriginY = self.tableView.contentOffset.y + self.tableView.frame.size.height - iAdFrame.size.height;
        CGRect newIAdFrame = CGRectMake(iAdFrame.origin.x, newOriginY, iAdFrame.size.width, iAdFrame.size.height);
        adBanner.frame = newIAdFrame;
        [self.tableView bringSubviewToFront:adBanner];
    }
}

Эта функция вызывается всякий раз, когда представление собирается расположить свои подпредставления (так что вам нужно только здесь, не нужно проверять прокрутку и т. д.):

-(void)viewWillLayoutSubviews{
    [super viewWillLayoutSubviews];
    [self positionAdBanner];
}

Вы также должны обработать методы ADBannerViewDelegate:

-(void)bannerViewDidLoadAd:(ADBannerView *)banner
{
    banner.hidden = NO;
    [self positionAdBanner];
}
-(void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error
{
    banner.hidden = YES;
}
...