2017-09-25 29 views
5

Mam UITableViewController do którego z powodzeniem stosowane w przeszłości gradient w tle, wysyłając nowo dodany podrzędny do tyłu:sendSubviewToBack na UITableView nie działa poprawnie w iOS 11

//performed on viewDidLoad 
UIView *bgView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 1.5*280, 1.5*SCREEN_HEIGHT)]; 
bgView.backgroundColor = [UIColor yellowColor]; 
CAGradientLayer *gradient = [CAGradientLayer layer]; 
gradient.frame = bgView.bounds; 
gradient.startPoint = CGPointMake(0, 0); 
gradient.endPoint = CGPointMake(1, 1); 
UIColor *topColor = UIColorFromRGB(0x229f80); 
UIColor *bottomColor = UIColorFromRGB(0x621ad9); 
gradient.colors = [NSArray arrayWithObjects:(id)[topColor CGColor], (id)[bottomColor CGColor], nil]; 
[bgView.layer insertSublayer:gradient atIndex:0]; 
[self.view addSubview:bgView]; 
[self.view sendSubviewToBack:bgView]; 
bgView = nil; 

Jednak to nie działa w systemie iOS 11 i bgView jest rzeczywiście umieszczony na górze wszystkich komórek.

enter image description here

Ktoś wie jak mogę rozwiązać ten problem? A może robiłem to źle przez cały czas?

+0

[self.view sendSubviewToBack: bgView]; zamiast tego spróbuj tej metody - (void) exchangeSubviewAtIndex: (NSInteger) index1 withSubviewAtIndex: (NSInteger) index2 – Ellen

Odpowiedz

1

Jeśli komórki są przezroczyste to można spróbować self.tableView.backgroundView = bgView;

0

Innym sposobem na to naprawić jest wywołanie [self.view sendSubviewToBack:bgView]; w tableView:willDisplayCell:forRowAtIndexPath:

Działa na nieprzejrzyste komórek również.

+0

Ale spróbuje wysłać subview za każdym razem, gdy wyświetlana jest komórka, co moim zdaniem jest zbędne. – CristiC

+0

Jeśli nie zrobisz tego za każdym razem, gdy wyświetli się komórka, każda nowsza komórka (zwrócona przez cellForRow) będzie pod tym widokiem. –

0

Wygląda na to, że funkcja sendSubview (UIView) sendSubview (toBack: UIView) nie działa dla UITableViewControllers w systemie iOS11. Więc mogę zamienić to:

// in ViewDidLoad 
// set the backgroundImage 
    let backgroundImage = UIImageView(frame: self.view.bounds) 
    backgroundImage.image = UIImage(named: "background.png") 
//  self.view.addSubview(backgroundImage) // NO LONGER WORKS 
//  self.view.sendSubview(toBack: backgroundImage) // NO LONGER WORKS 
    self.tableView.backgroundView = backgroundImage 
0

Jeśli nie potrzebujemy tło widoku do przewijania wraz z widoku tabeli, można użyć

self.tableView.backgroundView = bgView; 

Jeśli potrzebujesz pogląd tła, przewijania , zmiany warstwy zPosition na ujemną, aby pracować w iOS 11:

[self.view insertSubview:bgView atIndex:0]; 
bgView.userInteractionEnabled = NO; 
bgView.layer.zPosition = -1; 
Powiązane problemy