Подтвердить что ты не робот

IOS: Поместите UIView поверх UITableView в фиксированном положении

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

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

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

Ответ 1

Я ценю, что это старый вопрос. Но я нашел ответы либо с ложной информацией в части, либо с нечеткими фрагментами. Итак, для чего он все же стоит, вот как я добавил "плавающий" вид в нижней части моего представления 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

Ответ 2

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

В 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.

Ответ 3

  • Добавьте свое представление в супервизор представления таблицы (если возможно; UITableViewController делает это невозможным).

  • Добавьте представление в представление таблицы и переместите его в методе делегата -scrollViewDidScroll: (UITableViewDelegate является под-протоколом UIScrollViewDelegate).

Ответ 4

У меня была аналогичная проблема, когда я хотел добавить индикатор загрузки поверх моего 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 window object to add the custom view on top of the view controller
[delegate.window addSubview: loadingView]; 
}