Search code examples
iosuiviewcore-graphicsgradientdrawrect

Crosshatch in IOS using CoreGraphics?


How would one crosshatch (apply a set of parallel lines at 45 degrees) across the fill of a shape in IOS using core graphics? Sample code?

(I'm specially interested in use with an MKPolygon in MKMapKit, however for the moment just trying to see if it's possible in a UIView using drawRect?. So fill the background of a UIView with crosshatch'ing)


Solution

  • Here's what I was talking about over in the Apple Developer Forum:

    #import "CrossHatchView.h"
    
    @implementation CrossHatchView
    
    static  CGFloat  sides = 5.0;
    
    - (void)drawRect:(CGRect)rect
    {
        CGRect  bounds = self.bounds;
    
        UIBezierPath  *path = [UIBezierPath bezierPath];
    
        CGFloat  xCentre = CGRectGetMidX(bounds);
        CGFloat  yCentre = CGRectGetMidY(bounds);
        CGFloat  radius = 0.0;
    
        if (CGRectGetWidth(bounds) > CGRectGetHeight(bounds)) {
            radius = CGRectGetHeight(bounds) / 2.0;
        } else {
            radius = CGRectGetWidth(bounds) / 2.0;
        }
        CGFloat  angleIncrement = 2.0 * M_PI / sides;
    
        CGFloat  initialAngle = ( M_PI + (2.0 * M_PI / sides) ) / 2.0;
    
        for (NSUInteger  i = 0;  i < sides;  i++) {
            CGFloat  angle = initialAngle + i * angleIncrement;
            CGFloat  x = xCentre + radius * cos(angle);
            CGFloat  y = yCentre + radius * sin(angle);
            CGPoint  point = CGPointMake(x, y);
            if (i == 0) {
                [path moveToPoint:point];
            } else {
                [path addLineToPoint:point];
            }
        }
        [path closePath];
        [[UIColor cyanColor] set];
        [path addClip];
    
        CGRect  pathBounds = [path bounds];
    
        [path removeAllPoints];
        CGPoint  p1 = pathBounds.origin;
        CGPoint  p2 = CGPointMake(CGRectGetMaxX(pathBounds), CGRectGetMaxY(pathBounds));
        [path moveToPoint:p1];
        [path addLineToPoint:p2];
        path.lineWidth = 400.0;
        CGFloat  dashes[] = { 2.0, 2.0 };
        [path setLineDash:dashes count:2 phase:0.0];
        [[UIColor blackColor] set];
        [path stroke];
    }
    
    @end