Reputation: 389
I have a UIViewController
that is also a UIScrollViewDelegate
The UIViewController
has multiple slides that are UIViews
and for each slide I want to set a different gradient background color programmatically, however it does not seem to be working as no gradient is being set.
My UIView
extension
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)
}
}
My FirstSlide
that has it's own FirstSlide.xib
import UIKit
class FirstSlide: UIView {
}
In my 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)
}
}
Upvotes: 0
Views: 476
Reputation: 409
It's not working because you are passing UIColors instead of CGColors in the .colors Array of the CAGradientLayer.
It should be like this:
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)
}
Upvotes: 3