如何渲染包含UIBezierPath子视图的UIView图像

时间:2014-03-27 08:37:18

标签: ios uiview uiimage uibezierpath cashapelayer

我有一个UIView,其中包含一些使用UIBezierPath绘制的子视图。每个子视图都包含一个将图像作为掩码的滚动视图。当我尝试渲染整个视图(整体)的图像时,不是从路径制作图像,而是绘制子视图的单个矩形的图像。让我通过数字说清楚:

原始视图:

enter image description here

渲染Image后我得到了什么:

enter image description here

我不知道我错过了什么。请指导我。感谢。

代码:

IrregularSquare

@interface IrregularSquare : UIView
{
UIScrollView *imageResizer;
CAShapeLayer *maskLayer;
}
@end

@implementation IrregularSquare

- (id)initWithFrame:(CGRect)frame index:(NSInteger) index
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
        self.backgroundColor = [UIColor clearColor];
        self.layer.backgroundColor = [UIColor clearColor].CGColor;

    }
    return self;
}

-(void) drawRect:(CGRect)rect
{
    UIBezierPath *aPath = [UIBezierPath bezierPath];

            [aPath moveToPoint:CGPointMake(CGRectGetMinX(rect), CGRectGetMinY(rect))];
            [aPath addLineToPoint:CGPointMake(CGRectGetMaxX(rect), CGRectGetMinY(rect))];
            [aPath addLineToPoint:CGPointMake(CGRectGetMaxX(rect) - 20, CGRectGetMidY(rect) - 10)];
            [aPath addLineToPoint:CGPointMake(CGRectGetMaxX(rect) - 5, CGRectGetMaxY(rect) - 10)];
            [aPath addLineToPoint:CGPointMake(CGRectGetMidX(rect) + 10, CGRectGetMaxY(rect))];
            [aPath addLineToPoint:CGPointMake(CGRectGetMidX(rect) - 20, CGRectGetMaxY(rect) - 20)];
            [aPath addLineToPoint:CGPointMake(CGRectGetMinX(rect), CGRectGetMaxY(rect) - 20)];
    [aPath closePath];
    aPath.lineWidth = 2;
    [[UIColor whiteColor] setStroke];
    [aPath stroke];
    [self initializeImageWithPath]; //this method adds scrollview to main view and assigns an image to scrollview with mask
}

-(void) initializeImageWithPath
{
    CGRect aFrame = somevalue;

    self.backImage = [[UIImageView alloc] initWithFrame:aFrame];
    self.backImage.contentMode = UIViewContentModeScaleAspectFill;
    self.backImage.clipsToBounds = YES;

    imageResizer = [[UIScrollView alloc] initWithFrame:self.bounds];
    imageResizer.showsHorizontalScrollIndicator = imageResizer.showsVerticalScrollIndicator = NO;
    imageResizer.scrollEnabled = YES;
    imageResizer.backgroundColor = [UIColor clearColor];
    imageResizer.zoomScale = 1.0;
    imageResizer.delegate = self;
    imageResizer.clipsToBounds = YES;
    [imageResizer addSubview:self.backImage];
    [self addSubview: imageResizer];

    maskLayer = [CAShapeLayer layer];
    maskLayer.path = [aPath CGPath];
    self.layer.mask = maskLayer;

}

IrregularShapesContainer.m

@implementation IrregularShapesContainer

-(void) drawSubviews
{
    for(UIView *aView in self.subviews)
        [aView removeFromSuperview];

    IrregularSquare *sq1 = [[IrregularSquare alloc] initWithFrame:CGRectMake(HORIPADDING, VERTICALPADDING, (self.frame.size.width - (HORIPADDING * 2) - (SPACING * 2)) * .5, (self.frame.size.height - (VERTICALPADDING) - SPACING) * .5) index:1];
    [self addSubview:sq1];
    [sq1.layer display];
    [self randomlyPlaceImage:sq1];
    sq1.irrViewDelegate = self;

//many similar instances are added in following code
}

@end

我希望我的问题很清楚..感谢任何帮助。

0 个答案:

没有答案