我环顾四周,似乎有人说你可以在放大后重新渲染数据,因为你知道UIScrollView的比例因子。我还看过一些关于将你的图层设置为CATiledLayer并设置levelsOfDetailBias和levelsOfDetail的帖子。
我所拥有的是UIScrollView,其中包含一个结果视图,它是UIView的子类:
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
CATiledLayer *tiledLayer = (CATiledLayer *)self.layer;
tiledLayer.levelsOfDetailBias = 3;
tiledLayer.levelsOfDetail = 3;
self.opaque = YES;
}
return self;
}
/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect
{
// Drawing code
}
*/
+ (Class)layerClass {
return [CATiledLayer class];
}
在我的班级里,我有UIScrollView和ResultsView,我这样做:
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {
return self.ResultsView;
}
这足以让文字重新呈现(敏锐)吗?或者我需要在
中实现一些东西 - (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx {
}
如果是这样,我不知道该怎么做。在我的带有UIScrollView和ResultsView的类中,在ResultsView(在XIB中)中,我只有几个UILabel和UIViews(UIViews用于视图的标题/页脚)。所以我不知道如何从ResultsView重绘它们。虽然ResultsView在XIB中将UILabel和UIViews作为它的子代,但我不确定如何从ResultsView类重绘它们,以及我还需要做什么。
或者这是错误的做法?我只需要通过scrollViewDidEndZooming:delegate方法中的比例因子来调整UILabel和UIView的大小吗? TIA
答案 0 :(得分:19)
我认为你采取了错误的做法。如果您的视图包含不执行任何自定义绘图的UILabel和UIViews,我不会使用CATiledLayer支持的视图。而是实现scrollViewDidEndZooming:withView:atScale:delegate方法并执行以下操作:
- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale {
scale *= [[[self.scrollView window] screen] scale];
[view setContentScaleFactor:scale];
for (UIView *subview in view.subviews) {
[subview setContentScaleFactor:scale];
}
}
答案 1 :(得分:4)
我有一些小的东西可以添加到已接受的解决方案中,这会导致我几分钟的痛苦,以防万一其他人遇到同样的事情。
循环浏览视图中的所有子视图,并且调用setContentScaleFactor时不会考虑任何子视图本身是否有子视图。如果你有一个更复杂的设置,请确保循环遍历这些容器视图的子视图并调用
[subview setContentScaleFactor:scale];
每个。我创建了一个方法,我可以在给定视图的所有子视图上调用setContentScaleFactor,并为屏幕上的每个“容器视图”调用它。
- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale
{
scale *= [[[self.scrollView window] screen] scale];
[view setContentScaleFactor:scale];
for (UIView *subview in view.subviews)
{
[self setContentSizeForView:subview andScore:scale];
//Loop through all the subviews inside the subview
for(UIView *subSubview in subview.subviews)
{
[self setContentSizeForView:subSubview andScale:scale];
}
}
}
- (void) setContentSizeForView:(UIView*) view andScale:(float)scale
{
[view setContentScaleFactor:scale];
}