我的iOS类和viewDidLoad中有一个viewController,我使用CAGradient创建一个渐变并将其添加到我的视图层。我希望这也出现在其他视图中,那么最好的方法是什么? (Objective-c和ios的新手,我知道如何在PHP和C#中执行此操作)。
答案 0 :(得分:4)
一种方法是在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];
}
答案 1 :(得分:3)
最简单的方法是创建一个基类,使您希望渐变的所有其他视图控制器继承。只需在基类中的viewDidLoad中执行您正在执行的操作。
要记住的一件事是,如果您在任何子类中覆盖viewDidLoad,请不要忘记调用[super viewDidLoad]
,以便渐变代码仍然有机会运行。
答案 2 :(得分:1)
没有Objective-C特定的方法来解决这个问题。您应该能够从其他语言中提取解决方案。我的个人建议是将CAGradientLayer
拉出到UIView
子类中,这样您就不必混合图层和视图层次结构(您还可以获得UIView
的触摸处理优势)。一个很好的实现是OBGradientView
。这也应该足够简化代码,确保没有任何重复。
从这里开始,它取决于视图的重用方式。如果你有几个不同的视图控制器都在相同的位置使用相同的渐变,那么你可以像@Lance推荐的那样创建一个UIViewController
子类。这应该是一个相当罕见的用例。
如果你在应用程序的无数个地方使用相同的渐变,我通常会将一个类方法添加到Theme
对象 - 只是NSObject
的一个简单子类 - 它会产生特定的渐变,我改编自WWDC 2012 session 216。将这些方法作为一个类别添加没有实际区别;我发现过多地分解代码。
我强烈建议不要使用rdelmar的解决方案,因为它是a)有状态的,b)不灵活。该方法没有为您提供指向CAGradientLayer
的指针,因此您无法对其进行修改。即使它确实如此,您也可以想象一下不想要在层次结构中添加图层的情况 - 也许您想要替换另一个对象的图层,或者等到用户需要之后将图层添加到层次结构的操作。