Ios 是否在UITableView下设置背景层?

Ios 是否在UITableView下设置背景层?,ios,cocoa-touch,Ios,Cocoa Touch,我遵循本教程学习渐变: 但我似乎无法在tableView下插入子层,该层是这样插入的: CAGradientLayer *bgLayer = [BackgroundLayer blueGradient]; bgLayer.frame = self.view.bounds; [self.view.layer insertSublayer:bgLayer atIndex:0]; 为什么它会出现在我的故事板桌面视图上方 编辑: 我的表格视图就在那里,在图层下面,我可以单击它和所有东西,但我看不到它

我遵循本教程学习渐变:

但我似乎无法在tableView下插入子层,该层是这样插入的:

CAGradientLayer *bgLayer = [BackgroundLayer blueGradient];
bgLayer.frame = self.view.bounds;
[self.view.layer insertSublayer:bgLayer atIndex:0];
为什么它会出现在我的故事板桌面视图上方

编辑:


我的表格视图就在那里,在图层下面,我可以单击它和所有东西,但我看不到它

如果你把它放在视图中,它应该会工作。但是,将大小设置为self.view.bounds只会使渐变移到屏幕底部——当您滚动时,渐变将随之滚动。如果希望渐变与表视图一样长,则必须将其高度设置为contentSize的高度。您还需要将单元格的背景色设置为“清除”,以查看渐变(在tableView:willDisplayCell:forIndexPath:)


这种方法的一个问题是渐变的长度和外观会因表视图中的行数而异。如果希望渐变保持相同的长度,则可以将其添加到窗口中(并使表格视图的背景色清晰)。

如果将其放在ViewDidDisplay中,则应该可以使用。但是,将大小设置为self.view.bounds只会使渐变移到屏幕底部——当您滚动时,渐变将随之滚动。如果希望渐变与表视图一样长,则必须将其高度设置为contentSize的高度。您还需要将单元格的背景色设置为“清除”,以查看渐变(在tableView:willDisplayCell:forIndexPath:)


这种方法的一个问题是渐变的长度和外观会因表视图中的行数而异。如果希望渐变保持相同的长度,可以将其添加到窗口中(并使表视图的背景色清晰).

正确的做法是,在tableView滚动时,渐变将保持在表视图后面而不滚动,这是在tableView的backgroundView中设置渐变

如何在Swift 3中执行此操作

let gradientLayer = CAGradientLayer()
let bgView = UIView.init(frame: self.tableView.frame)
bgView.layer.insertSublayer(gradientLayer, at: 0)
self.tableView.backgroundView = bgView

当tableView滚动时,正确的方法是在tableView的backgroundView中设置渐变,使渐变保持在tableView后面而不滚动

如何在Swift 3中执行此操作

let gradientLayer = CAGradientLayer()
let bgView = UIView.init(frame: self.tableView.frame)
bgView.layer.insertSublayer(gradientLayer, at: 0)
self.tableView.backgroundView = bgView

对于任何面临此问题的人:

如果使用的是
UITableViewController
,则需要在生命周期的后期设置自定义视图,例如
viewdilayoutsubview
原因是
viewdiload
tableView框架尚未设置

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    
    let backgroundView = UIView(frame: tableView.bounds)
    backgroundView.backgroundColor = .white
    backgroundView.layer.insertSublayer(bgLayer, at: 0)
    
    tableView.backgroundView = backgroundView
} 

对于任何面临此问题的人:

如果使用的是
UITableViewController
,则需要在生命周期的后期设置自定义视图,例如
viewdilayoutsubview
原因是
viewdiload
tableView框架尚未设置

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    
    let backgroundView = UIView(frame: tableView.bounds)
    backgroundView.backgroundColor = .white
    backgroundView.layer.insertSublayer(bgLayer, at: 0)
    
    tableView.backgroundView = backgroundView
} 

你从哪里调用这个代码?是否在插入渐变层后添加表视图?在viewDidLoadtableView中调用是通过故事板[self.view.layer addSublayer:bgLayer]添加的,并在将tableView添加到self.view之前进行添加。如果您使用的是UITableViewController的子类,则self.view仍将指向表视图,这意味着渐变层将被添加为表视图的子层。如果是这种情况,您可能必须使用UIViewController的子类并自己添加表视图。您从何处调用此代码?是否在插入渐变层后添加表视图?在viewDidLoadtableView中调用是通过故事板[self.view.layer addSublayer:bgLayer]添加的,并在将tableView添加到self.view之前进行添加。如果您使用的是UITableViewController的子类,则self.view仍将指向表视图,这意味着渐变层将被添加为表视图的子层。在这种情况下,您可能必须使用UIViewController的子类并自己添加表视图。如果self.view是表视图,则它将仅与表视图一起滚动(使用UITableViewController时,这一点是正确的)。如果self.view是表视图,则它仅与表视图一起滚动(使用UITableViewController时也是如此)。如果同时使用UIRefreshControl呢?这在将其设置为backgroundView时效果最好。因此,两者似乎都是问题…如果同时使用UIRefreshControl呢?如果将其设置为backgroundView时效果最好。因此,两者似乎都是问题。。。