缩放UILabel并以正确的大小重新渲染字体

Ben*_*man 14 iphone uiscrollview uilabel

我有一个UILabel我想要启用放大的多行.

我用a嵌入它UIScrollView并设置最小缩放到.25和最大缩放到4.这很好用,但是我UILabel的字体在除1以外的任何缩放级别看起来相当粗略.

我可以处理这个方法:

- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale
Run Code Online (Sandbox Code Playgroud)

为了将我的UILabel的字体重新调整为更大的尺寸,但视图仍然放大,所以它看起来总是很糟糕.

有没有办法让标签的文字重新渲染一个我完成缩放?

重要的是用户当前在文本中滚动的位置不会丢失.

(为了了解我的目标,请注意在移动Safari中缩放文本时如何缩放/消除锯齿一瞬间然后它会在您当前的缩放比例下清晰显示)

Bra*_*son 16

UIScrollView的内置缩放仅将变换应用于您的内容视图,这会导致比例因子1.0以上的任何内容变得模糊.对于真正清晰的渲染,您需要自己处理缩放.我在这个答案中描述了一大块过程.

您需要手动跟踪内容视图的比例因子,然后在-scrollViewDidEndZooming:withView:atScale:delegate方法中,您将应用该比例.对于您的UILabel,这将意味着更改字体大小以反映新的比例.

为了保持正确的滚动位置,您需要在上面的委托方法中获取UIScrollView的contentOffset,并计算新缩放的UILabel中对应的位置.然后设置滚动视图的contentSize以匹配UILabel的新大小,并使用-setContentOffset:animated:设置新计算的内容偏移量(动画设置为NO).

获得正确的数学计算有点棘手,但我在我的一个应用程序中缩放文本时这样做,这可以在该应用程序视频演示中看到(大约1/3标记).


小智 8

感谢valvoline和Scrimmers的答案.我的解决方案是你的解决方案.

子类UILabel是这样的:

UILabelZoomable.h

+ (Class) layerClass;
Run Code Online (Sandbox Code Playgroud)

UILabelZoomable.m

+ (Class) layerClass
{    
    return [CATiledLayer class];
}
Run Code Online (Sandbox Code Playgroud)

现在,当您在应用中使用花哨的新UILabelZoomable时,请记住这样做:

YourViewController.m

CATiledLayer *tiledLayer = (CATiledLayer*)textoLabel.layer;
tiledLayer.levelsOfDetail = 10;
tiledLayer.levelsOfDetailBias = 10;
Run Code Online (Sandbox Code Playgroud)

记得添加QuartzCore框架!

#import <QuartzCore/QuartzCore.h>
Run Code Online (Sandbox Code Playgroud)

享受锐利和美丽的渲染文字:

[UIView animateWithDuration:1 animations:^
     {
         yourLabel.transform = CGAffineTransformConcat(CGAffineTransformMakeScale(200, 200), CGAffineTransformMakeRotation(1));
     }];
Run Code Online (Sandbox Code Playgroud)


kab*_*cey 7

iOS 4+

- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale {
    scrollView.contentScaleFactor = scale;
    for (UIView *subview in scrollView.subviews) {
        subview.contentScaleFactor = scale;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果这太过密集且性能很慢,只需尝试仅为您的标签设置contentScaleFactor.


Raf*_*fal 5

这是我想出的一些东西:

func scrollViewDidEndZooming(scrollView: UIScrollView, withView view: UIView?, atScale scale: CGFloat) {
        label.font = UIFont(name: "YourFont", size: fontSize * scale)
        label.transform = CGAffineTransformConcat(CGAffineTransformMakeScale(1 / scale, 1 / scale), CGAffineTransformMakeRotation(0))
    }
Run Code Online (Sandbox Code Playgroud)

更新为 Swift 4.0:

func scrollViewDidEndZooming(_ scrollView: UIScrollView, with view: UIView?, atScale scale: CGFloat) {
    label.font = label.font.withSize(fontSize * scale)
    label.transform = CGAffineTransform(scaleX: 1 / scale, y: 1 / scale).concatenating(CGAffineTransform(rotationAngle: 0))
}
Run Code Online (Sandbox Code Playgroud)

还要记住,标签应该足够大以显示整个文本。有时需要一点点重画,但这种方法相当简单。