我有以下代码在UIView中显示标记。标记显示效果很好,一旦我们尝试使用变换进行缩放和缩放UIView,即使在调用setNeedsDisplay之后,第一个绘图仍保持原样。
My Custom UIView子类具有以下代码
- (void)drawRect:(CGRect)rect
{
// Drawing code
CGFloat w=20.0f;
CGFloat h=8.0f;
CGContextRef context=UIGraphicsGetCurrentContext();
CGContextSetFillColorWithColor(context, [UIColor blueColor].CGColor);
CGContextClearRect(context,self.bounds);
CGContextSetStrokeColorWithColor(context, [UIColor redColor].CGColor);
CGContextSetLineCap(context, 2.0);
CGMutablePathRef leftMarker=CGPathCreateMutable();
CGPathMoveToPoint(leftMarker, NULL, 0, 0);
CGPathAddLineToPoint(leftMarker, NULL, w, 0);
CGPathAddLineToPoint(leftMarker,NULL, w, h);
CGPathAddLineToPoint(leftMarker,NULL, h, h);
CGPathAddLineToPoint(leftMarker,NULL,h, w);
CGPathAddLineToPoint(leftMarker,NULL,0, w);
CGPathAddLineToPoint(leftMarker,NULL, 0, 0);
CGContextAddPath(context, leftMarker);
CGContextDrawPath(context, kCGPathFill);
const CGAffineTransform rightMarkerTransform=CGAffineTransformMakeRotateTranslate(DEGREES_TO_RADIANS(90),self.frame.size.width,0);
CGPathRef rightMarker=CGPathCreateCopyByTransformingPath(path, &rightMarkerTransform);
CGContextAddPath(context, rightMarker);
CGContextDrawPath(context, kCGPathFill);
const CGAffineTransform leftMarkerBottomTransform=CGAffineTransformMakeRotateTranslate(DEGREES_TO_RADIANS(270),0,self.frame.size.height);
CGPathRef leftMarkerbottom=CGPathCreateCopyByTransformingPath(path, &leftMarkerBottomTransform);
CGContextAddPath(context, leftMarkerbottom);
CGContextDrawPath(context, kCGPathFill);
const CGAffineTransform rightMarkerBottomTransform=CGAffineTransformMakeRotateTranslate(DEGREES_TO_RADIANS(180),self.frame.size.width,self.frame.size.height);
CGPathRef rightMarkerBottom=CGPathCreateCopyByTransformingPath(path, &rightMarkerBottomTransform);
CGContextAddPath(context, rightMarkerBottom);
CGContextDrawPath(context, kCGPathFill);
CGPathRelease(rightMarker);
CGPathRelease(leftMarkerbottom);
CGPathRelease(rightMarkerBottom);
CGPathRelease(leftMarker);
}
捏缩放代码列在下面
CGFloat lastScale;
-(void) handlepinchGesture:(UIPinchGestureRecognizer*)gesture{
UIView *gestureV=gesture.view;
CGFloat scale=gesture.scale;
switch (gesture.state) {
case UIGestureRecognizerStateBegan:
if(lastScale<1.0){
lastScale=1.0;
}
scale=lastScale;
break;
default:
break;
}
if(scale<1.0){
scale=1.0;
}
lastScale=scale;
gestureV.transform=CGAffineTransformMakeScale(scale, scale);
//Even this does not work ….[gestureV setNeedsDisplay];
gesture.scale=scale;
}
答案 0 :(得分:10)
确定已设置此设置(但默认为YES)。
self.clearsContextBeforeDrawing = YES;
来自UIView
当 设置为YES,绘图缓冲区自动清除为透明 调用drawRect:方法之前的黑色。此行为可确保 视图的内容时没有遗留任何视觉文物 被重新绘制。如果视图的opaque属性也设置为YES,则 视图的backgroundColor属性不能为nil或绘制错误 可能导致。此属性的默认值为YES。
如果将此属性的值设置为NO,则由您负责 确保在drawRect中正确绘制视图的内容: 方法。如果您的绘图代码已经过大量优化,请进行设置 这个属性是NO可以提高性能,尤其是在期间 当只需要重绘一部分视图时滚动。
答案 1 :(得分:5)
您需要将背景颜色设置为nil
以外的其他颜色。
来自DBD的答案(取自文档):
如果视图的opaque属性也设置为YES,则视图的backgroundColor属性不能为nil,否则可能会出现绘图错误。
您还需要确保self.clearsContextBeforeDrawing
设置为YES
。