2008-10-22 26 views
11

Nếu tôi có hai UIColors, cách tốt nhất để vẽ một gradient đồng đều giữa chúng trên một khu vực có kích thước tùy ý là gì?Thủ công vẽ một gradient trong ứng dụng iPhone?

Tôi đoán bạn sẽ tạo một lớp con UIView và sử dụng phương thức vẽ CG trong phương thức drawRect. Tôi chỉ không biết cái nào, hoặc nếu có bất kỳ cạm bẫy nào để xem, như hiệu suất. Có ai đã làm điều này không?

+0

Xem câu trả lời này: http://stackoverflow.com/questions/422066/gradients-on-uiview-and-uilabels-on-iphone/1931498 # 1931498 – Bill

Trả lời

20

Bạn sẽ muốn sử dụng CGGradient. Xem tài liệu "CGGradient Reference" của iPhone Dev Center.

+0

Rất tốt, cảm ơn. Tự hỏi làm thế nào tôi bị mất ... –

+28

Có nhiều nỗ lực ở đó, liên kết với tài liệu. – mxcl

+1

Liên kết này hoạt động tốt hơn: http://developer.apple.com/library/ios/#documentation/GraphicsImaging/Conceptual/drawingwithquartz2d/Introduction/Introduction.html –

50
#import <QuartzCore/QuartzCore.h>  
- (void) setGradient { 
    CAGradientLayer *gradient = [CAGradientLayer layer]; 
    gradient.frame = self.view.bounds; 
    gradient.colors = [NSArray arrayWithObjects:(id)[[UIColor whiteColor] CGColor], (id)[[UIColor blackColor] CGColor], nil]; 
    [self.view.layer insertSublayer:gradient atIndex:0];  
} 

Đừng quên thêm thư viện QuartzCore vào dự án của bạn.

+2

Tôi thực sự thích giải pháp này. Với mã, thay vì tham chiếu.IMHO nó sẽ nhận được nhiều phiếu bầu hơn. –

0

Đối với quan điểm rằng vẽ văn bản, chẳng hạn như UILabel, UITextViewUITextField, bạn nên thêm độ dốc bên trong drawRect chức năng. (xem ví dụ này post).

Có một số lớp con tuyệt vời của UILabel, UITextViewUITextField cho phép bạn thêm độ dốc khá dễ dàng (xem JBGradient on GitHub).

0

Giải pháp tương tự như @Anton Chikin nhưng mạnh hơn một chút. Chú ý ghi đè layerClass ... theo cách này, bạn không phải lo lắng về việc đặt khung và khung được tự động cập nhật khi xoay vòng & đổi kích thước.

class GradientView: UIView { 

    var colorA : UIColor = UIColor.greenColor() { 
     didSet { updateGradient() } 
    } 
    var colorB : UIColor = UIColor.blueColor() { 
     didSet { updateGradient() } 
    } 

    override class func layerClass() -> AnyClass { 
     return CAGradientLayer.self 
    } 

    required init(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
     updateGradient() 
    } 

    func updateGradient() { 
     if let gLayer = layer as? CAGradientLayer { 
      gLayer.colors = [colorA.CGColor, colorB.CGColor] 
     } 
    } 

} 

Nếu bạn đang sử dụng IB, bạn có thể đặt thuộc tính thông qua "Thuộc tính thời gian chạy do người dùng xác định".

Nếu bạn không sử dụng IB, hãy sử dụng trình khởi tạo khác.

3

Cách Swift thêm Gradient là:

var view : UIView = UIView(frame: CGRectMake(0, 0, 320, 100)) 
    var g : CAGradientLayer = CAGradientLayer() 
    g.frame = gradientView.bounds 
    g.colors = ["000000".UIColor.CGColor , "111111".UIColor.CGColor] 
    view.layer.insertSublayer(g, atIndex: 0) 

UIColor() là một lớp helper cho Swift để chuyển đổi hex color-rgb color, rất khuyến khích.

+0

Có gì là "000000" .UIColor.CGColor'? – JSmyth

+0

@JSmyth Đây là tiện ích mở rộng String của Swift chuyển đổi chuỗi gồm 6 chữ số thành UIColor. Bạn có thể dễ dàng tìm thấy nó trên github. –

+0

@ reza-rg Tôi có nghĩa là tôi đã nhắc bạn đề cập đến điều này trong câu trả lời của bạn. Không phải ai cũng đang sử dụng phần mở rộng đó cuối cùng. Tôi khuyên bạn nên thêm ít nhất một liên kết đến tiện ích. Hơn thế nữa, câu trả lời là tốt nhưng nó thực sự dễ dàng để đi với một cách tiêu chuẩn của instantiating màu sắc vì lợi ích của sự đơn giản (ví dụ 'UIColor.whiteColor(). CGColor') như câu hỏi là về gradient, không hex-đại diện của màu sắc. Cuối cùng, 'UIColor()' không phải là một lớp trợ giúp, nó là một đối tượng dựng sẵn. – JSmyth

0

hi bạn có thể sử dụng sau đây để áp dụng gradient trên xem

-(void)applyGradientEffecttoView:(UIView *)aView 
{ 
    // Create the colors 

    UIColor *darkOp = [UIColor colorWithRed:0.0f green:0.0f blue:0.0f alpha:1.0]; 
    UIColor *lightOp =[UIColor colorWithRed:255.0f green:255.0f blue:255.0f alpha:0.0]; 

     // Create the gradient 
     CAGradientLayer *gradient = [CAGradientLayer layer]; 

     // Set colors 
     gradient.colors = [NSArray arrayWithObjects: 
         (id)lightOp.CGColor, 
         (id)darkOp.CGColor, 
         nil]; 
    gradient.locations = [NSArray arrayWithObjects: 
          [NSNumber numberWithFloat:0.0f], 
          [NSNumber numberWithFloat:0.5], 
          nil]; 

    // Set bounds 
    gradient.frame = aView.bounds; 

    // Add the gradient to the view 

    [aView.layer insertSublayer:gradient atIndex:0]; 
} 
Các vấn đề liên quan