CAShapeLayer, используемый в подклассе UIView, не работает - PullRequest
7 голосов
/ 25 марта 2011

Я несколько часов пытался создать пунктирную границу вокруг моего UIView с помощью CAShapeLayer, но я не отображаю его.
ScaleOverlay.h

#import <UIKit/UIKit.h>
#import <QuartzCore/QuartzCore.h>

@interface ScaleOverlay : UIView <UIGestureRecognizerDelegate> {
    CAShapeLayer *shapeLayer_;
}
@end

ScaleOverlay.m

- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
    self.backgroundColor = [UIColor redColor];
    self.alpha = 0;
    //Round corners
    [[self layer] setCornerRadius:8.f];
    [[self layer] setMasksToBounds:YES];
    //Border
    shapeLayer_ = [[CAShapeLayer layer] retain];

    CGMutablePathRef path = CGPathCreateMutable();
    CGPathAddRect(path, NULL, frame);
    shapeLayer_.path = path;
    CGPathRelease(path);
    shapeLayer_.backgroundColor = [[UIColor clearColor] CGColor];
    shapeLayer_.frame = frame;
    shapeLayer_.position = self.center;

    [shapeLayer_ setValue:[NSNumber numberWithBool:NO] forKey:@"isCircle"];
    shapeLayer_.fillColor = [[UIColor blueColor] CGColor];
    shapeLayer_.strokeColor = [[UIColor blackColor] CGColor];
    shapeLayer_.lineWidth = 4.;
    shapeLayer_.lineDashPattern = [NSArray arrayWithObjects:[NSNumber numberWithInt:8], [NSNumber numberWithInt:8], nil];
    shapeLayer_.lineCap = kCALineCapRound;
}
return self;
}

В моем Superview нарисован красный прямоугольник, но не граница.Скопировал это из исходного примера в надежде, что это сработает, но это не так.

1 Ответ

16 голосов
/ 25 марта 2011

Вы никогда не добавите shapeLayer в качестве подслоя слоя вашего UIView, поэтому он никогда не отображается на экране. Попробуйте добавить

[self.layer addSublayer:shapeLayer_];

после настройки CAShapeLayer в методе -initWithFrame:.

Еще лучше, вы можете попробовать сделать слой поддержки вашего UIView CAShapeLayer, переопределив следующий метод класса:

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

Затем вы можете напрямую работать со слоем представления и исключить дополнительную переменную экземпляра CAShapeLayer.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...