UITableView上的sendSubviewToBack在iOS 11中无法正常工作

时间:2017-09-25 10:53:54

标签: objective-c ios11

我有一个UITableViewController,我过去成功应用了渐变背景,通过将新添加的子视图发送回来:

//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;

然而,这在iOS 11中不再有效,而bgView实际上放在所有单元格的顶部。

enter image description here

任何人都知道如何解决这个问题? 或者也许我一直都在做错?

4 个答案:

答案 0 :(得分:3)

如果您的单元格是透明的,那么您可以尝试self.tableView.backgroundView = bgView;

答案 1 :(得分:2)

另一种解决方法是在[self.view sendSubviewToBack:bgView];

中拨打tableView:willDisplayCell:forRowAtIndexPath:

它也适用于不透明的细胞。

答案 2 :(得分:0)

似乎addSubview(UIView)sendSubview(toBack:UIView)不再适用于iOS11中的UITableViewControllers。所以我换成了这个:

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

答案 3 :(得分:0)

如果您不需要将背景视图与表格视图一起滚动,则可以使用

self.tableView.backgroundView = bgView;

如果您需要滚动背景视图,请将图层的zPosition更改为负值,以使其在iOS 11中有效:

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