如何在已转换的UIView上重绘缩放文本?

时间:2011-04-07 04:41:25

标签: iphone text uiscrollview drawing cgaffinetransform

我目前正在实施不断扩展的时间表。当我缩放到时间轴时,我需要将绘制的文本保留在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是不可能的,因为我已经在转换视图以防止它垂直缩放。我也尝试在各种视图中绘制文本无济于事,而且,如果我可以避免,我宁愿不填充大量的对象。

感谢您的帮助!

1 个答案:

答案 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个月后我没有注意到任何不良影响。