iOS和Objective-c中面向对象的代码重用

时间:2013-09-14 00:42:46

标签: ios objective-c oop ios6

我的iOS类和viewDidLoad中有一个viewController,我使用CAGradient创建一个渐变并将其添加到我的视图层。我希望这也出现在其他视图中,那么最好的方法是什么? (Objective-c和ios的新手,我知道如何在PHP和C#中执行此操作)。

3 个答案:

答案 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的指针,因此您无法对其进行修改。即使它确实如此,您也可以想象一下想要在层次结构中添加图层的情况 - 也许您想要替换另一个对象的图层,或者等到用户需要之后将图层添加到层次结构的操作。