web-dev-qa-db-fra.com

iOS: Placez UIView sur UITableView en position fixe

J'ai besoin de mettre un UIView (pour les annonces) au-dessus d'un UITableView dans mon application iPhone. Le problème est que lorsque je fais défiler la table vers le bas, le UIView ajouté défile avec la table. Ce que je veux, c’est de le fixer au bas de l’écran. Y-a-t-il un moyen de faire ça?

C'est le code que j'ai utilisé pour ajouter UIView à la table:

 awView = [AdWhirlView requestAdWhirlViewWithDelegate:self]; 
 awView.autoresizingMask=UIViewAutoresizingFlexibleLeftMargin;
 [self.tableView addSubview:awView];
27
Mohamed Emad Hegab

J'apprécie que c'est une vieille question. Mais j'ai trouvé les réponses avec des informations fausses en partie et des extraits peu clairs. Voici donc comment j'ai ajouté une vue "flottante" au bas de ma vue UITableViewController. Oui, vous pouvez le faire, même si les réponses acceptées disent que vous ne pouvez pas.

Dans votre méthode -viewDidLoad, vous pouvez créer une vue que nous nommerons bottomFloatingView. Ceci est également configuré en tant que propriété.

Veillez à ajouter un encadré de contenu au bas de la vue du tableau. Cela évitera de masquer le contenu du tableau avec votre vue flottante.

Ensuite, vous devriez utiliser UIScrollViewDelegate pour mettre à jour le cadre de la vue flottante. 

L'illusion sera que votre vue est collée au fond. En réalité, cette vue bouge tout le temps que vous faites défiler et est toujours calculée pour apparaître en bas. Les vues de défilement sont très puissantes! Et sont probablement l'une des classes UIKit les plus sous-estimées, je pense.

Alors voici mon code. Notez la propriété, l'insert de contenu dans la vue table et l'implémentation de la méthode déléguée -scrollViewDidScroll:. J'ai créé ma vue flottante dans mon storyboard, c'est pourquoi vous ne pouvez pas voir cela en cours d'installation.

N'oubliez pas également que vous devriez probablement également utiliser KVO pour observer les modifications apportées au cadre de la vue Table. Il est possible que cela change avec le temps, le moyen le plus simple de le tester consiste à activer et désactiver la barre d'état des appels entrants dans le simulateur.

Dernière chose, si vous utilisez des vues d'en-tête de section dans votre vue tableau, ces vues seront la vue la plus haute de la vue tableau. Vous voudrez donc également placer votre vue flottante au premier plan. .

@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
29
Daniel

Voici comment cela a fonctionné pour moi. L'annonce reste au bas de la vue.

Dans ViewDidLoad, dans 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];

Ajoutez ensuite cette méthode quelque part dans le même fichier .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;
}

N'oubliez pas de déclarer awView.

33
Adriano Lucas
  1. Ajoutez votre vue à la vue supérieure de la vue table (si possible; UITableViewController rend ceci impossible).

  2. Ajoutez votre vue à la vue tableau et repositionnez-la dans la méthode -scrollViewDidScroll:delegate (UITableViewDelegate est un sous-protocole de UIScrollViewDelegate).

10
Martin Ullrich

J'ai eu un problème similaire où je voulais ajouter un indicateur de chargement sur mon UITableViewController. Pour résoudre ce problème, j'ai ajouté UIView en tant que sous-vue de la fenêtre. Cela a résolu le problème. Voici comment je l'ai fait. 

-(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]; 
}
4
Salman Hasrat Khan
- (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];
}
0
stack Stevn