使用UIView旋转变换的drawInRect行为

时间:2012-01-16 15:54:22

标签: cocoa-touch uiview uikit cgaffinetransform

我在理解在UIView上执行旋转变换时如何定义传递给drawInRect方法的参数时遇到问题。

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

问题在于根据文档我不应该在rect之外绘制,但考虑到我应该绘制的内容,我的图像无法适应那里。

有人可以向我解释在我的UIView旋转的情况下我应该如何使用drawInRect吗?


要提供有关我的问题的更多详细信息,请执行以下操作:

我有一个内部带有contentView的滚动视图(子类)。我在内容视图中添加了我的UIViews。

有问题的视图由处理程序图像(左下角)和主图像(右上角)组成。用户应该通过按下处理程序来抓取视图,但这不是重点。

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中添加到内容视图中,执行以下操作:

第一次发生,

然后addSubview:

然后我设置了scrollViewScale参数,

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

然后我旋转UIView。

从第三行开始,代码从

执行
- (void)scrollViewDidZoom:(UIScrollView *)scrollView

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

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

2 个答案:

答案 0 :(得分: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之外绘图并不是真正的问题,但只会影响性能。

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

答案 1 :(得分:1)

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

我正在多次设置frame参数,并定义了一些不应该执行的CGAffineTransformation。

现在每次我需要重置帧时,我重置仿射变换,改变帧并设置后面的仿射变换。

一切都按照这种方式运作。