我目前正在实施不断扩展的时间表。当我缩放到时间轴时,我需要将绘制的文本保留在UIView上相同的相对位置,它们是在处理缩放的UIScrollView内绘制的。 (基本上像GoogleMaps上的引脚)但是,我不想垂直缩放,所以我通过覆盖来应用转换:
- (void)setTransform:(CGAffineTransform)newValue;
{
newValue.d = 1.0;
[super setTransform:newValue];
}
这可以很好地保持时间轴垂直固定并允许它水平扩展。但是,我在setNeedsDisplay:
中调用的方法中绘制文本标签for (int i = 1; i < 11; i++)
{
CGRect newFrame = CGRectMake(i * (512.0/11.0) - (512.0/11.0/2.0), self.frame.size.height - 16.0, 512.0/11.0, 32.0);
NSString *label = [NSString stringWithFormat:@"%d", i+1];
[label drawInRect:newFrame withFont:[UIFont systemFontOfSize:14.0]];
}
这会将我的文本绘制在滚动视图中的正确位置,并且几乎完美无缺。但是,由于我的变换使缩放视图保持垂直,文本水平扩展而不是垂直扩展,因此延伸得非常可怕。我似乎无法以正确的宽高比重绘文本。使用UILabels可以工作,但是我将渲染和操作超过1,000个这样的标签,所以我最好喜欢在drawRect或类似的东西中绘制静态图像。
我已经尝试更改CGRect我正在绘制文本(值得一试),并且应用CGAffineTransformIdentity是不可能的,因为我已经在转换视图以防止它垂直缩放。我也尝试在各种视图中绘制文本无济于事,而且,如果我可以避免,我宁愿不填充大量的对象。
感谢您的帮助!
答案 0 :(得分:1)
我没有在'setTransform:'方法中应用变换,而是截取变换的比例,并调整正在变换的视图的 frame 。代码(大致)如下:
- (void)setTransform:(CGAffineTransform)newValue;
{
// The 'a' value of the transform is the transform's new scale of the view, which is reset after the zooming action completes
// newZoomScale should therefore be kept while zooming, and then zoomScale should be updated upon completion
_newZoomScale = _zoomScale * newValue.a;
if (_newZoomScale < 1.0)
_newZoomScale = 1.0;
// Resize self
self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, _originalFrame.size.width * _newZoomScale, self.frame.size.height);
}
如评论中所述,每次发生新的缩放操作时,CGAffineTransform的变换值都会重置(但是, 在缩放操作期间保持)。所以,我在我的UIView子类中保留了两个实例变量(不确定它是否非常优雅,但它并不是非常可怕):视图实例化的原始帧,以及视图的“当前”缩放比例(在此之前)当前的缩放动作)。
_originalFrame
是为了确定当前缩放帧的正确大小而引用的内容,并且_zoomScale
(当前缩放操作之前的视图比例)设置为在包含此UIView的UIScrollView中调用_newZoomScale
回调时的didFinishZooming
值。
所有这些都允许UIView的坐标系在变焦期间不被变换,因此可以在视图上绘制文本等而没有任何失真。回想一下这个解决方案,我猜测你还可以考虑基于拉伸坐标系的变换和绘图。不确定哪个更有效。在setTransform:
没有打电话给我,我有点担心,但在使用和开发约6个月后我没有注意到任何不良影响。