放大UIScrollView后渲染内容

时间:2011-10-05 18:23:38

标签: iphone

我环顾四周,似乎有人说你可以在放大后重新渲染数据,因为你知道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

2 个答案:

答案 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];
}