我的 UITableView 顶部的问题定位横幅

Posted

技术标签:

【中文标题】我的 UITableView 顶部的问题定位横幅【英文标题】:Problem positioning banner on top of my UITableView 【发布时间】:2010-09-14 22:36:24 【问题描述】:

我希望能够在我的 UITabBar 正上方显示一个 ADBannerView(它显示一个 UITableView)。不幸的是,我的横幅没有正确定位。它会出现在 UITableView 的正下方,然后当我滚动时,横幅将保留在我的 UITableView 的中间。

我希望横幅出现在 UITabBar 的正上方,并允许 UITableView 在用户拖动时在横幅后面滚动。

-(void)layoutForCurrentOrientation:(BOOL)animated

    CGFloat animationDuration = animated ? 0.2 : 0.0;
    // by default content consumes the entire view area
    CGRect contentFrame = self.view.bounds;
    // the banner still needs to be adjusted further, but this is a reasonable starting point
    // the y value will need to be adjusted by half the banner height to get the final position
    CGPoint bannerCenter = CGPointMake(CGRectGetMidX(contentFrame), CGRectGetMaxY(contentFrame));
    CGFloat bannerHeight = 0.0;

    // First, setup the banner's content size and adjustment based on the current orientation
    if(UIInterfaceOrientationIsLandscape(self.interfaceOrientation))
    
        banner.currentContentSizeIdentifier = ADBannerContentSizeIdentifier480x32;
        bannerHeight = 32.0;
    
    else
    
        banner.currentContentSizeIdentifier = ADBannerContentSizeIdentifier320x50;
        bannerHeight = 50.0;
    

    // Depending on if the banner has been loaded, we adjust the content frame and banner location
    // to accomodate the ad being on or off screen.
    // This layout is for an ad at the bottom of the view.
    if(banner.bannerLoaded)
    
        contentFrame.size.height -= bannerHeight;
        bannerCenter.y -= bannerHeight / 2.0;
    
    else
    
        bannerCenter.y += bannerHeight / 2.0;
    

    // And finally animate the changes, running layout for the content view if required.
    [UIView animateWithDuration:animationDuration
                     animations:^
                         self.tableView.frame = contentFrame;
                         [self.tableView layoutIfNeeded];

                         banner.center = bannerCenter;
                     ];

【问题讨论】:

想知道您是否能够在不添加父视图的情况下解决此问题。 我遇到了同样的问题 - 表格视图没有正确调整并最终落后于 ADBannerView - 你设法解决了这个问题吗? 【参考方案1】:

我想出了如何在不使用自定义 UIViewControllerUITableView 的情况下为通常的 UITableViewController 做到这一点。诀窍是动态调整横幅视图的位置,使其始终位于可见区域的底部。

您刚刚将横幅视图添加为子视图并相应地调整表格插图:

- (void)viewDidLoad 

        [super viewDidLoad];

        ...

        //init banner and set it's frame (here we use 320x50 banner) 
        self.bannerView = [[UIView alloc] init];
        self.bannerView.frame = CGRectMake(0, self.view.frame.size.height - 50, 320, 50);

        //add as subview
        [self.view addSubview:self.bannerView];

        //set proper bottom inset depending on your banner height
        self.tableView.contentInset = UIEdgeInsetsMake(0, 0, 50, 0);

滚动表格时,您需要根据内容偏移量调整横幅位置:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView

    //refresh banner frame during the scrolling
    CGRect bannerFrame = self.bannerView.frame;
    bannerFrame.origin.y = self.view.frame.size.height - 50 + self.tableView.contentOffset.y;
    self.bannerView.frame = bannerFrame;

我的示例是用于底部定位的横幅,但很容易更改计算以将其应用于放置在表格顶部的横幅。

【讨论】:

【参考方案2】:

您应该创建一个视图,将您的 tableview 和横幅广告作为单独的实体,而不是诉诸上面的骇客。也就是说,创建一个新的 UIView,它将设置为您的视图控制器的“视图”属性。在此视图中,将您的横幅广告放在屏幕外(其 y 原点应为横幅高度的负值),并且您的 tableview 的原点应为 0,0。成功加载横幅后,将横幅设置为原点 0,0 并将 tableview 的原点移动到 0,bannerHeight。

这将为您提供您将在 iAds 上的 WWDC10 视频中看到的效果,如果您还没有观看,我建议您观看。

【讨论】:

我从 developer.apple.com 上的 iAdSuite 获得了这个骇客 :) 天啊...如果我愿意,我会提交一个错误。

以上是关于我的 UITableView 顶部的问题定位横幅的主要内容,如果未能解决你的问题,请参考以下文章

如何将 UITableView 正确定位在视图顶部的固定点?

位于顶部的 UITableView 标头

使用自动布局将视图定位在 tableview 的顶部

Admob横幅不坚持uitableview swift的底部

UITableView indexPathsForVisibleRows 返回错误的行

如何在 Obj C 中的 UIImageView 顶部绘制横幅