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)
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.
这是我想出的一些东西:
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)
还要记住,标签应该足够大以显示整个文本。有时需要一点点重画,但这种方法相当简单。
| 归档时间: |
|
| 查看次数: |
10637 次 |
| 最近记录: |