2017-01-06 2 views
0

enter image description here Обращает волновой слой, переопределение drawInContext:(CGContextRef)ctx метода, так как волна линия синусоидальная, так что я разрезать его на сегменты по значению Расчитать волны и объединить их в CGMutablePathRefCALayer DrawRect Сглаживание не работало

Вот что я сделал в -(void)drawInContext:(CGContextRef)ctx

//join style 
CGContextSetLineJoin(ctx, kCGLineJoinRound); 
CGContextSetLineCap(ctx, kCGLineCapRound); 

CGContextSetAllowsAntialiasing(ctx, true); 
CGContextSetShouldAntialias(ctx, true); 

CGContextSetFillColorWithColor(ctx, [UIColor themeColor].CGColor); 
CGContextSetStrokeColorWithColor(ctx, [UIColor themeColor].CGColor); 

CGContextSaveGState(ctx); 

CGMutablePathRef mutablePath = CGPathCreateMutable(); 

CGPathMoveToPoint(mutablePath, NULL, 0, 0); 
CGPathAddLineToPoint(mutablePath, NULL, 0, [self getSinPoint:0 WaveHeight:self.waveHeight]); 

//Calculate the Sin funciton value to draw lines and join them into path 
for (float i = 0; i <= self.bounds.size.width; i+= 1) { 
    NSInteger pointY = [self getSinPoint:i WaveHeight:self.waveHeight]; 
    CGPathAddLineToPoint(mutablePath, NULL, i, pointY); 
} 

CGPathAddLineToPoint(mutablePath, NULL, self.bounds.size.width, 0); 

CGPathCloseSubpath(mutablePath); 

[[UIColor themeColor]set]; 


CGContextAddPath(ctx, mutablePath); 

CGContextFillPath(ctx); 

CGContextRestoreGState(ctx); 

ответ

1

enter image description here

Одно решение использует BezierPath нарисовать волну, 1. Вырезать линию на сегмент, такой как 20 2. Текущий индекс текущей строки - это событие, получить контрольную точку ниже центра текущего сегмента 3. Текущий индекс строки нечетный, затем получить контрольную точку вверх по центру линии

... 
for (NSInteger i = 0; i <= self.waveCount; i++) { 

    CGPoint beginPoint = CGPointMake(i * self.waveWidth, pointY); 
    CGPoint endPoint = CGPointMake((i + 1) * self.waveWidth, pointY); 
    if (i%2 == 0) { 

     CGPoint controlPoint = [self getCenterControlPointUp:beginPoint End:endPoint]; 
     CGPathAddQuadCurveToPoint(mutablePath, NULL, controlPoint.x, controlPoint.y, endPoint.x, endPoint.y); 
    }else{ 
     CGPoint controlPoint = [self getCenterControlPointDown:beginPoint End:endPoint]; 
     CGPathAddQuadCurveToPoint(mutablePath, NULL, controlPoint.x, controlPoint.y, endPoint.x, endPoint.y); 
    } 
} 
... 

метода, чтобы получить контрольную точку отрезки линии

//Below 
-(CGPoint)getCenterControlPointDown:(CGPoint)begin End:(CGPoint)end{ 
    return CGPointMake((begin.x + end.x)/2, (begin.y + end.y)/2 + self.waveHeight * 2); 
} 

//Above 
-(CGPoint)getCenterControlPointUp:(CGPoint)begin End:(CGPoint)end{ 
    return CGPointMake((begin.x + end.x)/2, (begin.y + end.y)/2 - self.waveHeight * 2); 
} 
+0

Может быть, используя метод греховного для расчета сократить линию в слишком много линий окладных края размыты, но я не понимаю почему он все еще не достаточно гладкий, даже я рисую каждую линию на 0,5 дп. Я могу принять его с низкой производительностью, но не с пилообразным. – pf0214

Смежные вопросы