iOS:将UIView放在UITableView的顶端

我需要在我的iPhone应用程序的UITableView的顶部放置一个UIView(广告)。 问题是,当我滚动表底部添加的UIView滚动与表。 我想要的是它被固定在屏幕的底部。 有没有办法做到这一点?

这是我用来将UIView添加到表中的代码:

awView = [AdWhirlView requestAdWhirlViewWithDelegate:self]; awView.autoresizingMask=UIViewAutoresizingFlexibleLeftMargin; [self.tableView addSubview:awView]; 

我很欣赏这是一个老问题。 但是我发现部分和不明确的片段有错误的信息。 所以对于它还是值得的,这里是我如何在我的UITableViewController视图的底部添加一个“浮动”视图。 是的,你可以这样做,即使接受的答案说你不能。

在你的-viewDidLoad方法中,你可以创build一个我们将命名为bottomFloatingView的视图。 这也是一个财产。

一定要添加一个插入到表格视图底部的内容,这将避免隐藏任何表格的内容与你的浮动视图。

接下来,您应该使用UIScrollViewDelegate来更新浮动视图的框架。

幻想将是你的观点被困在底部。 实际上,这种观点一直在移动,而且总是被计算出来在底部。 滚动视图非常强大! 也许是我认为最被低估的UIKit类之一。

所以这里是我的代码。 请注意属性,表格视图中的内容以及-scrollViewDidScroll:委托方法的实现。 我在故事板中创build了我的浮动视图,这就是为什么你看不到被设置。

另外不要忘记你也应该使用KVO来观察表格视图框架的变化。 这是可能的,随着时间的推移,最简单的方法来testing,通过打开和closures模拟器中的通话状态栏。

最后一点,如果您在表格视图中使用节标题视图,则这些视图将成为表格视图中最顶层的视图,因此您还需要将浮动视图置于前面,在更改框架时执行此操作。

 @interface MyTableViewController () @property (strong, nonatomic) IBOutlet UIView *bottomFloatingView; @end @implementation MyTableViewController static NSString *const cellIdentifier = @"MyTableViewCell"; - (void)dealloc { [self.tableView removeObserver:self forKeyPath:@"frame"]; } - (void)viewDidLoad { [super viewDidLoad]; [self.tableView addSubview:self.bottomFloatingView]; self.tableView.contentInset = UIEdgeInsetsMake(0.0, 0.0, CGRectGetHeight(self.bottomFloatingView.bounds), 0.0); self.tableView.scrollIndicatorInsets = UIEdgeInsetsMake(0.0, 0.0, CGRectGetHeight(self.bottomFloatingView.bounds), 0.0); [self.tableView addObserver:self forKeyPath:@"frame" options:0 context:NULL]; } #pragma mark - UITableViewDataSource - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return 20; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath]; cell.textLabel.text = [NSString stringWithFormat:@"Row %d", indexPath.row]; return cell; } #pragma mark - UIScrollViewDelegate - (void)scrollViewDidScroll:(UIScrollView *)scrollView { [self adjustFloatingViewFrame]; } #pragma mark - KVO - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if([keyPath isEqualToString:@"frame"]) { [self adjustFloatingViewFrame]; } } - (void)adjustFloatingViewFrame { CGRect newFrame = self.bottomFloatingView.frame; newFrame.origin.x = 0; newFrame.origin.y = self.tableView.contentOffset.y + CGRectGetHeight(self.tableView.bounds) - CGRectGetHeight(self.bottomFloatingView.bounds); self.bottomFloatingView.frame = newFrame; [self.tableView bringSubviewToFront:self.bottomFloatingView]; } @end 

这是如何为我工作。 广告停留在视图的底部。

在ViewController.m的ViewDidLoad中:

 awView = [AdWhirlView requestAdWhirlViewWithDelegate:self]; awView.center = CGPointMake(self.view.frame.size.width/2, self.view.frame.size.height-kAdWhirlViewHeight/2); [self.view addSubview:awView]; 

然后在同一个.m文件的某个地方添加这个方法:

 -(void)scrollViewDidScroll:(UIScrollView *)scrollView { CGRect newFrame = awView.frame; newFrame.origin.x = 0; newFrame.origin.y = self.tableView.contentOffset.y+(self.tableView.frame.size.height-kAdWhirlViewHeight); awView.frame = newFrame; } 

不要忘记声明awView。

  1. 将你的视图添加到表视图的超视图(如果可能的话; UITableViewController使这不可能)。

  2. 将您的视图添加到表视图并将其重新放置在-scrollViewDidScroll: delegate方法中( UITableViewDelegateUIScrollViewDelegate的子协议)。

我有一个类似的问题,我想在我的UITableViewController上添加一个加载指示器。 为了解决这个问题,我添加了我的UIView作为窗口的子视图。 这解决了这个问题。 这就是我做的。

 -(void)viewDidLoad{ [super viewDidLoad]; //get the app delegate XYAppDelegate *delegate = [[UIApplication sharedApplication] delegate]; //define the position of the rect based on the screen bounds CGRect loadingViewRect = CGRectMake(self.view.bounds.size.width/2, self.view.bounds.size.height/2, 50, 50); //create the custom view. The custom view is a property of the VIewController self.loadingView = [[XYLoadingView alloc] initWithFrame:loadingViewRect]; //use the delegate's window object to add the custom view on top of the view controller [delegate.window addSubview: loadingView]; }