我在理解在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值。
答案 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。
现在每次我需要重置帧时,我重置仿射变换,改变帧并设置后面的仿射变换。
一切都按照这种方式运作。