webentwicklung-frage-antwort-db.com.de

iOS: Platziere UIView auf UITableView in einer festen Position

Ich muss in meiner iPhone-App eine UIView (für Anzeigen) auf eine UITableView setzen. Das Problem ist, dass wenn ich die Tabelle nach unten scrolle, der hinzugefügte UIView mit der Tabelle scrollt. Ich möchte, dass es am unteren Rand des Bildschirms befestigt wird. Gibt es eine Möglichkeit, dies zu tun?

Dies ist der Code, mit dem ich die UIView zur Tabelle hinzugefügt habe:

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

Ich schätze, dass dies eine alte Frage ist. Aber ich habe die Antworten entweder mit falschen Informationen und unklaren Ausschnitten gefunden. Und was es noch wert ist, so habe ich unten in der Ansicht meiner UITableViewController eine "schwebende" Ansicht hinzugefügt. Ja, das können Sie auch, wenn die akzeptierten Antworten dies nicht zulassen.

In Ihrer -viewDidLoad-Methode können Sie eine Ansicht erstellen, die als bottomFloatingView bezeichnet wird. Dies ist auch als Eigenschaft eingerichtet.

Stellen Sie sicher, dass Sie am unteren Rand Ihrer Tabellenansicht einen Inhaltseinsatz hinzufügen. Dadurch wird vermieden, dass der Inhalt der Tabelle in Ihrer unverankerten Ansicht ausgeblendet wird.

Als Nächstes sollten Sie das UIScrollViewDelegate verwenden, um den Frame der schwebenden Ansicht zu aktualisieren. 

Die Illusion wird sein, dass Ihre Sicht unten bleibt. In der Realität bewegt sich diese Ansicht während der gesamten Bildlaufzeit und wird immer so berechnet, dass sie unten angezeigt wird. Scroll-Ansichten sind sehr mächtig! Und wahrscheinlich eine der am meisten unterschätzten UIKit-Klassen, denke ich.

Also hier ist mein Code. Beachten Sie die Eigenschaft, den Inhaltseinsatz in der Tabellensicht und die Implementierung der -scrollViewDidScroll:-Delegatenmethode. Ich habe meine schwebende Ansicht in meinem Storyboard erstellt, weshalb Sie das Setup nicht sehen können.

Vergessen Sie auch nicht, dass Sie KVO wahrscheinlich auch verwenden sollten, um Änderungen am Rahmen der Tabellenansicht zu beobachten. Es ist möglich, dass sich dies im Laufe der Zeit ändert. Die einfachste Möglichkeit zum Testen besteht darin, die Statusanzeige des Anrufs im Simulator ein- und auszuschalten.

Wenn Sie in der Tabellenansicht Abschnittsheaderansichten verwenden, werden diese Ansichten in der Tabellenansicht die oberste Ansicht sein. Sie sollten Ihre schwebende Ansicht auch nach vorne bringen, wenn Sie den Rahmen ändern .

@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

So funktioniert es für mich. Die Anzeige bleibt am unteren Rand der Ansicht.

In ViewDidLoad, in 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];

Fügen Sie diese Methode dann irgendwo in derselben .m-Datei hinzu:

-(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;
}

Vergessen Sie nicht, awView zu deklarieren.

33
Adriano Lucas
  1. Fügen Sie Ihre Ansicht der Übersicht der Tabellenansicht hinzu (wenn möglich; UITableViewController macht dies unmöglich).

  2. Fügen Sie der Tabellenansicht Ihre Ansicht hinzu und positionieren Sie sie in der Methode -scrollViewDidScroll:delegate neu (UITableViewDelegateist ein Unterprotokoll von UIScrollViewDelegate).

10
Martin Ullrich

Ich hatte ein ähnliches Problem, als ich einen Ladeindikator auf meinem UITableViewController hinzufügen wollte. Um dieses Problem zu lösen, habe ich mein UIView als Unteransicht des Fensters hinzugefügt. Das hat das Problem gelöst. So habe ich es gemacht. 

-(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
- (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