2011-09-24 29 views
25

Tôi cần đặt UIView (cho quảng cáo) lên trên UITableView trong ứng dụng iphone của mình. Vấn đề là khi tôi di chuyển bảng xuống dưới cùng, UIView đã thêm đang cuộn với bảng. Những gì tôi muốn là cho nó được cố định trên dưới cùng của màn hình. Có cách nào làm được việc này không?iOS: Đặt UIView lên trên UITableView ở vị trí cố định

Đây là mã mà tôi đã sử dụng để thêm UIView để bàn:

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

ghi chú ... http://stackoverflow.com/questions/8258216/position-a-uiview-relative-to-the-bottom-of-the-parent-view/20287309#20287309 – Fattie

+0

Tôi nghĩ tất cả các câu trả lời dưới đây đều bị nhầm lẫn. Những gì bạn làm là thêm chế độ xem của bạn vào phần giám sát của chế độ xem bảng. Đơn giản như thế. – Jonny

Trả lời

26

Tôi đánh giá cao đây là câu hỏi cũ. Nhưng tôi đã tìm thấy câu trả lời với thông tin sai lệch một phần và đoạn trích không rõ ràng. Vì vậy, đối với những gì nó vẫn còn giá trị, đây là cách tôi thêm một "nổi" xem dưới cùng của quan điểm của tôi UITableViewController của. Có, bạn có thể làm điều đó, ngay cả khi các câu trả lời được chấp nhận nói rằng bạn không thể.

Trong phương thức -viewDidLoad của bạn, bạn có thể tạo chế độ xem mà chúng tôi sẽ đặt tên là bottomFloatingView. Điều này cũng được thiết lập như là một tài sản.

Hãy chắc chắn thêm nội dung vào dưới cùng của chế độ xem bảng, điều này sẽ tránh ẩn bất kỳ nội dung nào của bảng với chế độ xem nổi của bạn.

Tiếp theo, bạn nên sử dụng UIScrollViewDelegate để cập nhật khung của chế độ xem nổi.

Ảo giác sẽ là chế độ xem của bạn bị kẹt ở dưới cùng. Trong thực tế, chế độ xem này đang di chuyển mọi lúc bạn đang di chuyển và luôn được tính để xuất hiện ở dưới cùng. Chế độ xem cuộn rất mạnh mẽ! Và có lẽ là một trong những lớp UIKit bị đánh giá thấp nhất mà tôi nghĩ.

Vì vậy, đây là mã của tôi. Lưu ý thuộc tính, chèn nội dung trên chế độ xem bảng và thực hiện phương thức ủy quyền -scrollViewDidScroll:. Tôi đã tạo chế độ xem nổi trong bảng phân cảnh của mình, đó là lý do tại sao bạn không thể thấy thiết lập đó.

Cũng đừng quên bạn có lẽ cũng nên sử dụng KVO để quan sát các thay đổi đối với khung của bảng. Có thể để thay đổi theo thời gian, cách dễ nhất để kiểm tra đó là bằng cách bật và tắt thanh trạng thái cuộc gọi trong trình mô phỏng.Điều cuối cùng, nếu bạn đang sử dụng chế độ xem phần tiêu đề trong chế độ xem bảng, các chế độ xem đó sẽ là chế độ xem nhiều nhất trong chế độ xem bảng, vì vậy bạn cũng sẽ muốn đưa chế độ xem nổi lên phía trước, thực hiện việc này khi bạn thay đổi khung của nó.

@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 
+1

ấn tượng ấn tượng! – Fattie

+0

tuyệt vời, chỉ cần tính đến ngữ cảnh của KVO, thêm thông tin: [link] (http://stackoverflow.com/questions/11916502/importance-of-context-parameter-in-key-value-observing) –

+0

Cảm ơn liên kết! – Daniel

10
  1. Thêm tầm nhìn của bạn đến SuperView của xem bảng (nếu có thể; UITableViewController làm cho không thể này).

  2. Thêm chế độ xem của bạn vào chế độ xem bảng và đặt lại vị trí trong phương thức ủy quyền -scrollViewDidScroll: (UITableViewDelegate là giao thức con của UIScrollViewDelegate).

+0

tôi đã thử điều này - (void) scrollViewDidScroll: (UIScrollView *) scrollView { \t CGSize adSize = [awView actualAdSize]; \t CGRect newFrame = awView.frame; \t \t newFrame.origin.x = (self.view.bounds.size.width - adSize.width)/2; \t newFrame.origin.y = (self.view.bounds.size.height - adSize.height/2) -21; \t awView.frame = newFrame; } nhưng không hoạt động ở tất cả –

+2

không sử dụng self.view.bounds! chỉ điều chỉnh origin.y-value thành self.tableView.contentOffset.y –

+0

hoặc thêm nó vào phép tính của bạn ở trên nếu bạn muốn giữ nó ở giữa (nhưng vẫn sử dụng self.tableview.bounds.size.height để tính toán trung tâm) –

32

Đây là cách nó hoạt động đối với tôi. Quảng cáo nằm ở cuối chế độ xem.

Trong viewDidLoad, trong 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]; 

Sau đó thêm phương pháp này ở đâu đó trong file .m cùng:

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

Đừng quên khai báo awView.

+2

Chỉ nên là newFrame.origin.y = aScrollView.contentOffset.y –

4

Tôi gặp sự cố tương tự khi tôi muốn thêm chỉ báo tải trên đầu trang UITableViewController của mình. Để giải quyết điều này, tôi đã thêm UIView của tôi như là một subview của cửa sổ. Điều đó giải quyết được vấn đề. Đây là cách tôi đã làm nó.

-(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]; 
} 
Các vấn đề liên quan