2016-09-19 19 views
5

tôi mở rộng UIView để thêm một phương pháp addGradientWithColor() để có được nền gradient:Áp dụng nền gradient cho UIView sử dụng bố trí tự động

extension UIView { 
    func addGradientWithColor() { 
    let gradient = CAGradientLayer() 
    gradient.frame = self.bounds 
    gradient.colors = [gradientEndColor.CGColor, gradientStartColor.CGColor] 
    gradient.startPoint = CGPointMake(1,0) 
    gradient.endPoint = CGPointMake(0.2,1) 
    self.layer.insertSublayer(gradient, atIndex: 0) 
    } } 

Vấn đề của tôi là khi tôi chạy chế độ phong cảnh, các UIView không kéo dài

override func viewDidLayoutSubviews() { 
    super.viewDidLayoutSubviews() 
    self.view.addGradientWithColor() } 

tôi cố gắng để gọi viewDidLayoutSubviews() nhưng nó không hoạt động đúng

Dưới đây là ảnh chụp màn hình:

sau khi gỡ bỏ viewDidLayoutSubviews() enter image description here

+2

Bạn đã kiểm tra này [iOS8-auto-layout-and gradient] (http://stackoverflow.com/questions/31172151/ios8-auto-layout-and-gradient) – rob180

+1

Tại sao bạn không phân lớp UIView và ghi đè lên phương thức drawRect. Trong phương thức đó, chỉ cần thêm gradient. Sau đó, để UIView chỉ cần thêm các ràng buộc mà bạn cần và nó sẽ làm việc. – TomCobo

+0

@ rob180 cảm ơn. có nhưng không làm việc vấn đề của tôi – Aravi

Trả lời

4

Bạn có thể phân lớp phương thức draw UIView và ghi đè lên nơi bạn thêm gradient của mình.

class GradientView: UIView { 

private let gradient : CAGradientLayer = CAGradientLayer() 

override func layoutSublayers(of layer: CALayer) { 
    super.layoutSublayersOfLayer(layer) 
    self.gradient.frame = self.bounds 
} 

override public func draw(_ rect: CGRect) { 
    self.gradient.frame = self.bounds 
    self.gradient.colors = [gradientEndColor.CGColor, gradientStartColor.CGColor] 
    self.gradient.startPoint = CGPoint.init(x: 1, y: 0) 
    self.gradient.endPoint = CGPoint.init(x: 0.2, y: 1) 
    if self.gradient.superlayer == nil { 
     self.layer.insertSublayer(self.gradient, at: 0) 
    } 
} 

}

Sau khi bạn tạo UIView của bạn, bạn chỉ cần thêm những hạn chế của mình để quan điểm đó.

+0

cảm ơn cho một câu trả lời – Aravi

+0

Tôi muốn thêm 'if (! self.gradient.superlayer) {self.layer.insertSublayer (self.gradient, atIndex: 0)}' –

+0

Cảm ơn bạn, tôi đã cập nhật câu trả lời – TomCobo

2

Layers không autoresize họ tự. Để khắc phục sự cố này, bạn nên thay đổi khung lớp. Đây là một cách có thể triển khai:

override func viewDidLayoutSubviews() { 
    super.viewDidLayoutSubviews() 
    //Update you're layer based on the new frame 
    self.view.addGradientWithColor() 

} 
+0

trong trường hợp của tôi sau khi thêm phương thức viewdidlayoutsubviews(). Tôi nhận được hai chế độ xem gradient trong cùng một chế độ xem. Tôi đính kèm ảnh chụp màn hình trong câu hỏi chính nó – Aravi

4

bạn có thể lưu tham chiếu đến lớp và điều chỉnh khung của nó trong phương pháp xem layoutSublayersOfLayer. điều này có thể được thuê ngoài trong một lớp con UIView:

class GradientView: UIView { 

private let gradient : CAGradientLayer = CAGradientLayer() 

/** 
displays a gradient on the view 
*/ 
func addGradient() { 

    self.gradient.frame  = self.bounds 
    self.gradient.colors = [gradientEndColor.CGColor, gradientStartColor.CGColor] 
    gradient.startPoint  = CGPointMake(1,0) 
    gradient.endPoint  = CGPointMake(0.2,1)   
    self.layer.insertSublayer(self.gradient, atIndex: 0) 
} 

/** 
resizes the gradient with the view size 
*/ 
override func layoutSublayers(of layer: CALayer) { 
    super.layoutSublayers(of: layer) 
    self.gradient.frame = self.bounds 
} 
} 
+0

Cảm ơn. nó hoạt động tốt – Aravi

0

Lấy cảm hứng từ các giải pháp ở đây, tôi đã tạo lớp sau.

ví dụ sử dụng:

// Simple usage. From clear to black. 
let gradientView1 = GradientView(colors: [.clear, .black]) 

// Tweak locations. Here the gradient from red to green will take 30% of the view. 
let gradientView2 = GradientView(colors: [.red, .green, .blue], locations: [0, 0.3, 1]) 

// Create your own gradient. 
let gradient = CAGradientLayer() 
gradient.colors = [UIColor.red.cgColor, UIColor.blue.cgColor] 
let gradientView3 = GradientView(gradient: gradient) 

Lớp:

import UIKit 

/** 
* View with a gradient layer. 
*/ 
class GradientView: UIView { 

    let gradient : CAGradientLayer 

    init(gradient: CAGradientLayer) { 
     self.gradient = gradient 
     super.init(frame: .zero) 
     self.gradient.frame = self.bounds 
     self.layer.insertSublayer(self.gradient, at: 0) 
    } 

    convenience init(colors: [UIColor], locations:[Float] = [0.0, 1.0]) { 
     let gradient = CAGradientLayer() 
     gradient.colors = colors.map { $0.cgColor } 
     gradient.locations = locations.map { NSNumber(value: $0) } 
     self.init(gradient: gradient) 
    } 

    override func layoutSublayers(of layer: CALayer) { 
     super.layoutSublayers(of: layer) 
     self.gradient.frame = self.bounds 
    } 

    required init?(coder: NSCoder) { fatalError("no init(coder:)") } 
} 
Các vấn đề liên quan