Swift - 将渐变设置为UITableView截面背景

时间:2017-05-17 22:41:35

标签: ios swift uitableview

这就是我目前所拥有的:

let topColor = UIColor(red: 2/255, green: 138/255, blue: 191/255, alpha: 1)
let bottomColor = UIColor(red: 1/255, green: 66/255, blue: 125/255, alpha: 1)

func configureGradient() {
    let sectionRect = tableView.rect(forSection: currentSelectedIndex)
    let backgroundView = UIView(frame: sectionRect)
    backgroundView.layer.zPosition = -1
//        backgroundView.backgroundColor = bottomColor

    let gradientLayer = CAGradientLayer()
    gradientLayer.colors = [topColor, bottomColor]
    gradientLayer.locations = [0.0, 1.0]
    gradientLayer.frame = sectionRect
    backgroundView.layer.insertSublayer(gradientLayer, at: 0)

    tableView.addSubview(backgroundView)
}

我在网络电话和tableView.reloadData()

之后打电话给我

currentSelectedIndex默认为0,并在点按标题时更改为新部分的索引。这是一个手风琴桌面视图,所以最多只能看到一个部分。

由于某种原因,这不起作用,我不确定我在渐变代码中缺少什么。我知道它正确地得到了框架,因为如果我注释掉渐变代码并自己添加背景颜色,它就可以完美地运行。

此外,我将zPosition设置为-1。没有它backgroundView掩盖了整个视图。将其设置为-1我可以看到视图的其余部分,但它仍然阻止用户交互。当我查看UI层次结构时,它会在所有内容之上显示它。有没有更好的方法以编程方式调整位置低于其他一切?我已经尝试将其设置为-1000只是为了确定,但没有运气。

小结

  1. 为什么背景颜色可以正常工作而不是渐变?
  2. 是否有更好的方法来调整zPosition以阻止其阻止对用户界面的访问?

3 个答案:

答案 0 :(得分:1)

namespace App\Mail; use App\User; use Illuminate\Bus\Queueable; use Illuminate\Mail\Mailable; use Illuminate\Queue\SerializesModels; use Illuminate\Contracts\Queue\ShouldQueue; class RegisteredUserWelcome extends Mailable { use Queueable, SerializesModels; protected $user; /** * Create a new message instance. * * @return void */ public function __construct(User $user) { $this->user = $user; } /** * Build the message. * * @return $this */ public function build() { return $this->markdown('emails.registered') ->with([ 'firstname' => $this->user->firstname, 'lastname' => $this->user->lastname, ]); } } ' CAGradientLayer需要.colors个数组,但您要传递CGColor s。要解决此问题,请传递UIColor的{​​{1}}版本:

CGColor

出于某种原因,UIColor被声明为类型gradientLayer.colors = [topColor.cgColor, bottomColor.cgColor] ,因此编译器允许它通过,但最终会出现空白渐变。

答案 1 :(得分:0)

您应该使用CGColor代替UIColor s。

gradientLayer.colors = [topColor.cgColor, bottomColor.cgColor]

虽然参数为[Any]?,但文档说明了:

  

定义每个渐变色标的颜色的CGColorRef个对象数组。动画。

答案 2 :(得分:0)

对于我的问题的第2部分,这里是答案。移除addSubview以及zPosition并使用此功能:

tableView.insertSubview(backgroundView, at: 0)