iOS: поместите UIView поверх UITableView в фиксированном положении - PullRequest
27 голосов
/ 24 сентября 2011

Мне нужно поместить UIView (для рекламы) поверх UITableView в моем приложении для iphone.Проблема в том, что когда я прокручиваю таблицу до конца, добавленный UIView прокручивается вместе с таблицей.Я хочу, чтобы он был закреплен в нижней части экрана.Есть ли способ сделать это?

Это код, который я использовал, чтобы добавить UIView в таблицу:

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

Ответы [ 5 ]

33 голосов
/ 16 октября 2011

Вот как это работает для меня. Объявление остается в нижней части окна.

В ViewDidLoad, в YourController.m:

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.

29 голосов
/ 18 августа 2013

Я ценю, что это старый вопрос.Но я нашел ответы либо с ложной информацией частично и неясными фрагментами.Итак, для чего это все еще стоит, вот как я добавил «плавающее» представление в конец моего UITableViewController представления.Да, вы можете сделать это, даже если в принятых ответах сказано, что вы не можете.

В вашем методе -viewDidLoad вы можете создать представление, которое мы назовем bottomFloatingView.Это также настраивается как свойство.

Обязательно добавьте вставку содержимого в конец представления таблицы, это позволит избежать скрытия любого содержимого таблицы в плавающем представлении.

Затем вы должны использовать UIScrollViewDelegate для обновления фрейма плавающего вида.

Иллюзия будет заключаться в том, что ваш взгляд застрял на дне.В действительности это представление движется все время, пока вы прокручиваете, и всегда вычисляется, чтобы появиться внизу.Представления прокрутки очень мощные!И, наверное, один из самых недооцененных классов UIKit, я думаю.

Так вот мой код.Обратите внимание на свойство, вставку содержимого в табличном представлении и реализацию метода делегата -scrollViewDidScroll:.Я создал свой плавающий вид в раскадровке, поэтому вы не можете видеть это при настройке.

Также не забывайте, что вам, вероятно, следует также использовать KVO для наблюдения за изменениями фрейма табличного представления.Это может измениться со временем, самый простой способ проверить это, включив и выключив строку состояния входящего вызова в симуляторе.

Последнее, если вы используете представления заголовков разделов в своей таблицеВ этом представлении эти представления будут самыми верхними в представлении таблицы, поэтому вам также понадобится перевести плавающее представление вперед, сделайте это при изменении его фрейма.

@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
10 голосов
/ 24 сентября 2011
  1. Добавьте ваше представление к суперпредставлению табличного представления (если возможно; UITableViewController делает это невозможным).

  2. Добавьте ваше представление к табличному представлениюи переместите его в методе делегата -scrollViewDidScroll: (UITableViewDelegate - это субпротокол UIScrollViewDelegate).

4 голосов
/ 22 июля 2013

У меня была похожая проблема, когда я хотел добавить индикатор загрузки поверх моего 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]; 
}
0 голосов
/ 06 сентября 2018
- (void)viewDidLoad
{
    [super viewDidLoad];

    footerView = [[UIView alloc] initWithFrame:CGRectMake(0, SCREEN_HEIGHT-64, SCREEN_WIDTH, 64)];
    footerView.backgroundColor = [UIColor blueColor ];
    [self.navigationController.view addSubview:footerView];
}   

- (void)dealloc
{
    [footerView removeFromSuperview];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...