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

3

我在iOS类中有一个viewController,在viewDidLoad方法中,我使用CAGradient创建了一个渐变并将其添加到我的视图的层中。我希望它也能出现在其他视图中,那么最好的方法是什么?(对Objective-C和iOS不熟悉,但知道如何在PHP和C#中实现此操作。)


C# 的方式有多大的差异? - Bryan Chen
我正在逐渐熟悉语法、属性、协议和委托。 - cdub
2
面向对象的概念保持不变,如果您对语法有问题,请先学习它们。 - Bryan Chen
那我创建一个CAGradient类,然后将其作为属性调用? - cdub
3个回答

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];
}

3
最简单的方法是创建一个基类,让你想要应用渐变的所有其他视图控制器都继承自该基类。只需要在基类中的viewDidLoad函数中执行你正在执行的操作。
请注意,如果你覆盖了任何子类中的viewDidLoad函数,请不要忘记调用[super viewDidLoad]以确保渐变代码仍有机会运行。

1
没有 Objective-C 特定的解决方法。您应该能够从其他语言中找到解决方案。我的个人建议是将 CAGradientLayer 提取到 UIView 子类中,这样您就不必混合图层和视图层次结构(您还可以获得 UIView 的触摸处理优势)。一个很好的实现是 OBGradientView。这也应该简化代码,因此实际上没有任何重复。
从这里开始,这取决于视图的重用方式。如果您有多个不同的视图控制器都在相同的位置使用相同的渐变,则可以像 @Lance 建议的那样创建一个 UIViewController 子类。但这应该是一个相当罕见的用例。
如果你在应用程序中的多个地方使用相同的渐变色,我通常会将一个类方法添加到一个Theme对象中 - 这只是NSObject的一个简单子类 - 以创建特定的渐变色,我从WWDC 2012 session 216中改编而来。将这些方法添加为类别没有任何实际区别;我只是觉得这样会分割代码太多。

我强烈反对rdelmar的解决方案,因为它是a)有状态的,b)不灵活的。那种方法不会给你CAGradientLayer的指针,所以你无法对其进行修改。即使它能够做到这一点,你也可以想象一种情况,即你可能不想将一个层添加到层次结构中 - 也许你想替换另一个对象的层,或者等到用户执行操作后再将层添加到层次结构中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接