【问题标题】:Thickness of a drawn line changes when the UIView resizes当 UIView 调整大小时,绘制线的粗细会发生变化
【发布时间】:2014-06-05 10:51:41
【问题描述】:

我有一个 UIView 可以根据捏合手势调整自身大小。我还在上面视图的drawrect中绘制了两条线。我注意到当视图调整大小时,线条的粗细会发生变化。知道为什么吗?

我的控制器类中的代码

- (IBAction)handlePinch:(UIPinchGestureRecognizer *)recognizer {
        recognizer.view.transform = CGAffineTransformScale(recognizer.view.transform, recognizer.scale, recognizer.scale);
        recognizer.scale = 1;
}

UIView 子类中的代码

- (void)drawRect:(CGRect)rect
{
    NSLog(@"Drawing code");
    [super drawRect:rect];

    CGContextRef c = UIGraphicsGetCurrentContext();

    CGFloat red[4] = {1.0f, 0.0f, 0.0f, 1.0f};
    CGContextSetStrokeColor(c, red);
    CGContextBeginPath(c);
    CGContextMoveToPoint(c, 20.0f, 5.0f);
    CGContextAddLineToPoint(c, 20.0f, rect.size.height);
    CGContextStrokePath(c);

    CGContextSetStrokeColor(c, red);
    CGContextBeginPath(c);
    CGContextMoveToPoint(c, 0.0f, rect.size.height - 20);
    CGContextAddLineToPoint(c, rect.size.width - 20, rect.size.height - 20);
    CGContextStrokePath(c);
}

在阅读了答案和建议后,我尝试了以下方法,

- (IBAction)handlePinch:(UIPinchGestureRecognizer *)recognizer {
        recognizer.view.frame = CGRectApplyAffineTransform(recognizer.view.frame, CGAffineTransformScale(recognizer.view.transform, recognizer.scale, recognizer.scale));
}

但它给了我以下错误,

【问题讨论】:

  • 这是因为您正在更改 view.transform。尝试在 handlePinch: 中更改视图框架,然后调用 [view needsLayout] 方法。

标签: ios objective-c uiview


【解决方案1】:

变换将变换整个视图,包括其中绘制的内容。相反,更改视图的大小并重新绘制它。比如:

myView.frame = CGRectApplyAffineTransform(myView.frame, inverseAffine);

可能还需要考虑规模。

【讨论】:

  • 你能推荐一个可以根据 UIPinchGestureRecognizer 给出的比例改变大小的代码吗?
  • 使用部分解决方案更新答案,尽管您需要做一些跑腿工作
  • 如何得到inverseAffine值?
  • 那是来自复制/粘贴。您需要在紧要关头使用您的变换。
  • 你已经在上面的代码中做了。查看您创建转换的部分:CGAffineTransformScale
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多