【问题标题】:UIView gradient background is not getting setUIView 渐变背景未设置
【发布时间】:2023-03-19 08:56:01
【问题描述】:

我有一个UIViewController,它也是一个UIScrollViewDelegate UIViewController 有多张幻灯片是 UIViews,对于每张幻灯片,我想以编程方式设置不同的渐变背景颜色,但它似乎不起作用,因为没有设置渐变。

我的UIView 分机

import UIKit
extension UIView {
    func addGradient(){
        let gradient = CAGradientLayer()
        gradient.frame = self.bounds
        gradient.colors = [UIColor.black, UIColor.orange]
        let backgroundIndex:UInt32 = 0;
        self.layer.insertSublayer(gradient, at: backgroundIndex)
    }
}

我的FirstSlide 拥有自己的FirstSlide.xib

import UIKit

class FirstSlide: UIView {

}

在我的WelcomeSliderViewController

import UIKit

class WelcomeSliderViewController: UIViewController, UIScrollViewDelegate{

    @IBOutlet weak var slideScrollView: UIScrollView!
    @IBOutlet weak var pagerControl: UIPageControl!

    override func viewDidLoad() {
        super.viewDidLoad()
        slideScrollView.delegate = self
        let slides = createSlides()
        setupSliderView(slides: slides)
        pagerControl.numberOfPages = slides.count
        pagerControl.currentPage = 0
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }



    @IBAction func pagerControlClicked(_ sender: Any) {
        self.slideScrollView
            .scrollRectToVisible(CGRect(
                x: Int(self.slideScrollView.frame.size.width) * self.pagerControl.currentPage,
                y: 0,
                width:Int(self.slideScrollView.frame.size.width),
                height: Int(self.slideScrollView.frame.size.height)),
                                 animated: true)
    }


    func createSlides() -> [UIView] {
        let firstSlide: FirstSlide = Bundle.main.loadNibNamed("FirstSlide", owner:self , options: nil)?.first as! FirstSlide
 let secondSlide: SecondSlide = Bundle.main.loadNibNamed("SecondSlide", owner:self , options: nil)?.first as! SecondSlide

        firstSlide.addGradient()


return [firstSlide, SecondSlide]

    }

    func setupSliderView(slides:[UIView]) {
        slideScrollView.frame = CGRect(x: 0, y:0, width: view.frame.width, height: view.frame.height)
        slideScrollView.contentSize = CGSize(width: view.frame.width * CGFloat(slides.count), height: view.frame.height)

        for i in 0 ..< slides.count{
            slides[i].frame = CGRect(x: view.frame.width * CGFloat(i), y: 0, width: view.frame.width, height: view.frame.height)
            slideScrollView.addSubview(slides[i])
        }

    }

    func scrollViewDidEndDecelerating(_ scrollView : UIScrollView){
        let pageIndex = round(scrollView.contentOffset.x / view.frame.width)
        pagerControl.currentPage = Int(pageIndex)
    }

}

【问题讨论】:

    标签: ios swift3 gradient


    【解决方案1】:

    它不起作用,因为您在 CAGradientLayer 的 .colors 数组中传递的是 UIColors 而不是 CGColors。

    应该是这样的:

       func addGradient(){
        let gradient = CAGradientLayer()
        gradient.frame = self.bounds
        gradient.colors = [UIColor.black.cgColor, UIColor.orange.cgColor]
        let backgroundIndex:UInt32 = 0;
        self.layer.insertSublayer(gradient, at: backgroundIndex)
    }
    

    【讨论】:

    • 如何在FirstSlide 类中设置渐变?
    • 你只需要在你的 UIView 子类中重写 awakeFromNib 函数并像这样调用 addGradient() : override func awakeFromNib() { addGradient() }
    • 知道为什么渐变不适用于 iphone 6 plus 和 iphone 7 plus 上的全屏
    • 渐变将被添加到 UIVIew,所以它取决于它的大小。如果它适用于其他设备尺寸,可能是因为您的 UIView 需要根据您的设备调整大小。这可以通过自动布局来完成。
    猜你喜欢
    • 2015-09-01
    • 2015-04-23
    • 1970-01-01
    • 1970-01-01
    • 2020-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-25
    相关资源
    最近更新 更多