我在iOS类中有一个viewController,在viewDidLoad方法中,我使用CAGradient创建了一个渐变并将其添加到我的视图的层中。我希望它也能出现在其他视图中,那么最好的方法是什么?(对Objective-C和iOS不熟悉,但知道如何在PHP和C#中实现此操作。)
我在iOS类中有一个viewController,在viewDidLoad方法中,我使用CAGradient创建了一个渐变并将其添加到我的视图的层中。我希望它也能出现在其他视图中,那么最好的方法是什么?(对Objective-C和iOS不熟悉,但知道如何在PHP和C#中实现此操作。)
一种方法是在CALayer上创建一个类别,并添加一个方法来创建和添加自定义渐变。像这样:
@implementation CALayer (CustomGradient)
-(void)addCustomGradient {
CAGradientLayer *gradientLayer = [CAGradientLayer layer];
gradientLayer.frame = self.bounds;
gradientLayer.startPoint = CGPointMake(.25, 0);
gradientLayer.endPoint = CGPointMake(1, 1);
gradientLayer.colors = @[(id)[UIColor colorWithHue:.5 saturation:.6 brightness:1 alpha:1].CGColor,(id)[UIColor colorWithHue:.65 saturation:.6 brightness:1 alpha:.5].CGColor];
gradientLayer.locations = @[@0.0f,@1.00f];
[self insertSublayer:gradientLayer atIndex:0];
}
您可以像这样使用它:
#import "ViewController.h"
#import <QuartzCore/QuartzCore.h>
#import "CALayer+CustomGradient.h"
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self.view.layer addCustomGradient];
}
[super viewDidLoad]
以确保渐变代码仍有机会运行。CAGradientLayer
提取到 UIView
子类中,这样您就不必混合图层和视图层次结构(您还可以获得 UIView
的触摸处理优势)。一个很好的实现是 OBGradientView
。这也应该简化代码,因此实际上没有任何重复。UIViewController
子类。但这应该是一个相当罕见的用例。Theme
对象中 - 这只是NSObject
的一个简单子类 - 以创建特定的渐变色,我从WWDC 2012 session 216中改编而来。将这些方法添加为类别没有任何实际区别;我只是觉得这样会分割代码太多。我强烈反对rdelmar的解决方案,因为它是a)有状态的,b)不灵活的。那种方法不会给你CAGradientLayer
的指针,所以你无法对其进行修改。即使它能够做到这一点,你也可以想象一种情况,即你可能不想将一个层添加到层次结构中 - 也许你想替换另一个对象的层,或者等到用户执行操作后再将层添加到层次结构中。