Cocoa touch 使用UIView旋转变换的drawInRect行为

Cocoa touch 使用UIView旋转变换的drawInRect行为,cocoa-touch,uiview,uikit,cgaffinetransform,Cocoa Touch,Uiview,Uikit,Cgaffinetransform,在UIView上执行旋转变换时,我无法理解传递给drawInRect方法的参数是如何定义的 举个例子,我有一个UIView,它以307度的角度旋转。 在drawInRect方法中,我记录了以下内容: self.frame:{103.932,273.254},{64.3007,84.3374} rect(作为参数传递的变量:{0,0.102913},{18,89} 问题是,根据文档,我不应该在rect之外绘制,但是考虑到我应该绘制什么,我的图像将无法适合那里 有人能告诉我在UIView旋转的情况下

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

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

问题是,根据文档,我不应该在rect之外绘制,但是考虑到我应该绘制什么,我的图像将无法适合那里

有人能告诉我在UIView旋转的情况下应该如何使用drawInRect吗


为了更详细地了解我的问题,以下是我所做的:

我有一个内部带有contentView(子类)的scrollview。我在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)];
在视图中添加的UIView对象将显示在内容视图中,执行以下操作:

[_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)];
第一瞬间

然后添加子视图:

然后我设置了scrollViewScale参数

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

然后旋转视图

从第三行开始,代码从

- (void)scrollViewDidZoom:(UIScrollView *)scrollView
确保在需要显示时正确设置每个变量


定义大小变量的线条用于调整标记的大小,而不管滚动视图的缩放值如何。

基本上您只需按正常方式绘制,绘图将由iOS为您旋转。如果您愿意,可以获取此转换信息

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

CGContextRef ctx = UIGraphicsGetCurrentContext();
然后直接查询转换矩阵:

CGAffineTransform tf = CGContextGetCTM(ctx);
NSLog(@"current ctm: %@",NSStringFromCGAffineTransform(tf));
或者更好的方法是将绘图功能转换为设备:

CGAffineTransform tf = CGContextGetUserSpaceToDeviceSpaceTransform(ctx);
NSLog(@"user->device transform: %@",NSStringFromCGAffineTransform(tf));
drawRect:
中,您不应该过多地依赖传递的
cRect
,因为它主要用于提示视图的哪个部分需要更新。(例如,因为您调用了
-setNeedsDisplayInRect:
)。要获取视图所在的实际边界,请使用
self.bounds

CGRect
之外绘图并不是真正的问题,但只会稍微影响性能

编辑
请注意:
self.frame
是视图在父视图坐标系中的框架。如果移动、旋转或以其他方式变换视图,它会发生变化。
self.bounds
是视图在其自身坐标系中的框架,因此在位置或变换的变化下保持不变。

因此我找到了解决问题的方法:

我多次设置frame参数,定义了一些CGAffineTransformation,这是不应该做的

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


一切都按此方式运行。

我尝试记录self.bounds,它给出的值类似于rect变量,因此使用它也无济于事。我尝试根据需要绘制图像,忽略rect参数,但图像被截断。可能有一个UIView参数我设置不正确。它是否在不旋转的情况下工作307度?或者你想一次解决所有问题吗?是的,不旋转就可以了。我在UIView上画了两个图像,一个在右上角,另一个在左下角。@Alexandre:好的,你能给我看一些代码吗?
-drawRect:
可能还有你应用旋转的线条?嗨,你可以检查answ下面我将详细介绍我的实现。谢谢!如果您想提供更多信息,请编辑您的问题。