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