【问题标题】:drawInRect behavior with UIView rotation transform带有 UIView 旋转变换的 drawInRect 行为
【发布时间】:2012-01-16 15:54:21
【问题描述】:

当对 UIView 执行旋转变换时,我无法理解传递给 drawInRect 方法的参数是如何定义的。

举个例子,我有一个 UIView,我旋转了 307 度角。 在 drawInRect 方法中,我记录以下内容: self.frame: {{103.932, 273.254}, {64.3007, 84.3374}} rect(作为参数传递的变量:{{0, 0.102913}, {18, 89}}

问题是根据文档我不应该在矩形之外绘制,但考虑到我应该绘制什么,我的图像不可能适合那里。

谁能向我解释一下在我的 UIView 旋转的情况下我应该如何使用 drawInRect ?


为了更详细地说明我的问题,以下是我的做法:

我有一个滚动视图,里面有一个 contentView(子类)。我在内容视图中添加了我的 UIView。

相关视图由处理程序图像(左下)和主图像(右上)组成。用户应该通过按下处理程序来获取视图,但这不是重点。

UIView的drawInRect方法包含以下内容:

[_image drawInRect:CGRectMake(handlerSize.width, 0, _image.size.width, _image.size.height)];
CGSize size = CGSizeMake(kHandPickerWidth/self.scrollViewScale, kHandPickerHeight/self.scrollViewScale);
[_handPickerImage drawInRect:(0, _image.size.height, size.width, size.height)];

UIViews 对象被添加到内容视图中的 viewWillAppear 中,执行以下操作:

第一次实例化,

然后添加子视图:

然后我设置scrollViewScale参数,

然后我设置frame参数(根据右上角显示的图片(可能会有所不同)

然后我旋转 UIView。

从第三行开始,代码从第 3 行开始执行

- (void)scrollViewDidZoom:(UIScrollView *)scrollView

确保在需要显示时正确设置每个变量。

定义 size 变量的行是为了调整标记的大小,而不考虑滚动视图的 zoomScale 值。

【问题讨论】:

  • 如果您想提供更多信息,请编辑您的问题。

标签: cocoa-touch uiview uikit cgaffinetransform


【解决方案1】:

你基本上只是像往常一样画画,iOS 会为你旋转画作。如果您愿意,可以获取此转换信息。

您需要获取对当前图形上下文的引用:

CGContextRef ctx = UIGraphicsGetCurrentContext();

然后直接查询变换矩阵:

CGAffineTransform tf = CGContextGetCTM(ctx);
NSLog(@"current ctm: %@",NSStringFromCGAffineTransform(tf));

或者更好的是,将绘图功能转换为设备:

CGAffineTransform tf = CGContextGetUserSpaceToDeviceSpaceTransform(ctx);
NSLog(@"user->device transform: %@",NSStringFromCGAffineTransform(tf));

drawRect: 中,您不应过分依赖传递的CGRect,因为它主要用作提示哪些视图需要更新。 (例如,因为您在上面调用了-setNeedsDisplayInRect:)。要获得视图所在的实际边界,请使用self.bounds

CGRect 之外绘图没有真正的问题,但只会稍微影响性能。

编辑 附言。澄清:self.frame 是您的视图在父视图坐标系中的框架。如果您移动、旋转或以其他方式变换视图,它会发生变化。 self.bounds 是您的视图在其自己的坐标系中的框架,并且(因此)在位置或变换的变化下保持不变。

【讨论】:

  • 我尝试记录 self.bounds,它给出的值类似于 rect 变量,因此使用它也无济于事。我试图根据需要绘制图像,忽略 rect 参数,但我的图像被截断。可能有一个 UIView 参数我没有正确设置。
  • 在不旋转 307 度的情况下可以工作吗?还是想一口气解决所有问题?
  • 是的,没有旋转它工作正常。我在 UIView 上绘制了两张图片,一张在右上角,另一张在左下角。
  • @Alexandre:好的,你能显示一些代码吗? -drawRect: 可能还有您应用旋转的行?
  • 嗨,您可以查看下面的答案,其中我提供了有关我的实施的详细信息。谢谢!
【解决方案2】:

所以我找到了解决问题的方法:

我多次设置帧参数,定义了一些不应该完成的 CGAffineTransformation。

现在每次我需要重置帧时,我都会重置仿射变换,更改帧并设置仿射变换。

一切都按照这种方式进行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-04
    • 1970-01-01
    • 2014-06-20
    • 1970-01-01
    • 1970-01-01
    • 2015-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多