Ios 向UIView添加CAGradientLayer子层的问题

Ios 向UIView添加CAGradientLayer子层的问题,ios,uiview,cagradientlayer,Ios,Uiview,Cagradientlayer,我已经创建了一个CAGradientLayer,我想将其作为子层添加到UIView。我可以毫无问题地将它添加到self.view.layer,但我一生都无法在添加到UIView时让它出现 这是简化的代码 - (CAGradientLayer*) makeGradient { //method returns the gradient layer CAGradientLayer *gradeLayer = [CAGradientLayer layer]; gradeL

我已经创建了一个
CAGradientLayer
,我想将其作为子层添加到
UIView
。我可以毫无问题地将它添加到
self.view.layer
,但我一生都无法在添加到
UIView
时让它出现

这是简化的代码

- (CAGradientLayer*) makeGradient 
{

    //method returns the gradient layer

    CAGradientLayer *gradeLayer = [CAGradientLayer layer];
    gradeLayer.colors = [NSArray arrayWithObjects:(id)[[UIColor whiteColor] CGColor], (id)[[UIColor blackColor] CGColor], nil];
    gradeLayer.locations =  [NSArray arrayWithObjects:[NSNumber numberWithFloat:0.2], [NSNumber numberWithFloat:0.5], nil];

    return gradeLayer;
}


-(void)addGradient
{

    //method creates UIView, then creates Gradient, and tries to add it to the UIView

    UIView *myView = [[UIView alloc] initWithFrame:self.view.frame];
    myView.backgroundColor = [UIColor clearColor];
    myView.opaque = NO;

    CAGradientLayer *bg = [self makeGradient];
    CGRect myRect = myView.bounds;
    myRect.size.height = myRect.size.height * 5;
    myRect.origin.y = myView.bounds.size.height-myRect.size.height;

    bg.frame = myRect;

    //Adding gradient to self.view.layer works like a charm...
    //[self.view.layer insertSublayer:bg atIndex:0];

    //...however, adding it to my custom view doesn't work at all.
    [myView.layer insertSublayer:bg atIndex:0];

}

我错过了什么?提前感谢您提供的任何见解

您的问题是您似乎没有在子层上设置帧。相反,一个更干净的选项是将
UIView
子类化并使用

CustomGradientView.h

// For CALayers, make sure you also add the QuartzCore framework
#import <QuartzCore/QuartzCore.h>
#import <UIKit/UIKit.h>

@interface CustomGradientView : UIView

// Redeclare the layer property but as the new CALayer class so it can receive the correct
// messages without compiler warnings.
@property (nonatomic, strong, readonly) CAGradientLayer *layer;

@end

你是否每个人都给了
bg
一个框架元素在你的代码中的什么位置?使用子类会有问题吗?@Rich,我没有在代码中的任何其他地方为“bg”分配帧。就这一次。你对子类化有什么想法?你是说对UIView进行子类化?我只是想说清楚。谢谢您可以将
UIView
子类化,并直接使用
self.layer
,这样会更整洁,而且不必处理帧。我会发布一个答案:)干杯,@Rich!一旦我让它先工作,我就要对它进行子类化。我想你是在暗示[myView.layer insertSublayer:bg atIndex:0]是罪魁祸首。谢谢你的帮助!是的,你真的应该做
bg.frame=self.layer.bounds
但是如果视图
frame
发生更改,您必须再次更新
bg
frame,子类化更好:)我已将
属性重新定义移动到头文件,以便在需要时可以访问它。非常感谢!我现在正在实施这个。出于某种原因,它在子类中也不起作用。编辑看到您的更改以修复编译器错误。仍然不起作用。CustomGradientView*BGView=[[CustomGradientView alloc]initWithFrame:self.view.frame];我确实更新了我的答案,在头文件中定义了
,只需再次检查以确保您已经将其包含在内。哦,还要确保您正在导入
QuartzCore
——我假设您以前使用的是
CAGradientLayer
。我已经导入了QuartzCore。我已经复制并粘贴了你在这里的东西,但我仍然无法让它工作。在我的SKScene类中,我像这样初始化该类:CustomGradientView*BGView=[[CustomGradientView alloc]init];还是什么都没有(它不会编译或崩溃吗?
#import "CustomGradientView.h"

@interface CustomGradientView ()

@end

@implementation CustomGradientView

+(Class)layerClass
{
    return [CAGradientLayer class];
}

-(instancetype)init
{
    self = [super init];
    if (self) {
        [self customInit];
    }
    return self;
}

-(instancetype)initWithCoder:(NSCoder *)decoder
{
    self = [super initWithCoder:decoder];
    if (self) {
        [self customInit];
    }
    return self;
}

-(void)customInit
{
    self.layer.colors = [NSArray arrayWithObjects:(id)[[UIColor whiteColor] CGColor], (id)[[UIColor blackColor] CGColor], nil];
    self.layer.locations =  [NSArray arrayWithObjects:[NSNumber numberWithFloat:0.2], [NSNumber numberWithFloat:0.5], nil];
}

@end