UIScrollView缩放后重绘子视图

时间:2011-12-16 15:51:13

标签: ios uiscrollview

我有一个带有子UIView(CATiledLayer)的UIScrollView - 然后我有更多关于该视图的子视图(其中一些是UITextViews)

缩放后,一切都很模糊。

我已经阅读了关于这个主题的各种文章,它们似乎都表明我必须处理scrollViewDidEndZooming然后'做一些变换的东西,搞乱框架并调整内容偏移'。请有人能让我摆脱痛苦,并解释这是如何起作用的。

提前致谢...

2 个答案:

答案 0 :(得分:15)

我有一个类似的问题,我需要缩放文字。我没有使用CATiledLayer,所以这可能或不适合你。我也没有使用ARC,所以如果你是,你也必须调整它。

我想出的解决方案是设置UIScrollViewDelegate方法,如下所示:

// Return the view that you want to zoom. My UIView is named contentView.
-(UIView*) viewForZoomingInScrollView:(UIScrollView*)scrollView {
  return self.contentView;
}

// Recursively find all views that need scaled to prevent blurry text
-(NSArray*)findAllViewsToScale:(UIView*)parentView {
    NSMutableArray* views = [[[NSMutableArray alloc] init] autorelease];
    for(id view in parentView.subviews) {

        // You will want to check for UITextView here. I only needed labels.
        if([view isKindOfClass:[UILabel class]]) {
            [views addObject:view];
        } else if ([view respondsToSelector:@selector(subviews)]) {
            [views addObjectsFromArray:[self findAllViewsToScale:view]];
        }
    }
    return views;
}

// Scale views when finished zooming
- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale {
    CGFloat contentScale = scale * [UIScreen mainScreen].scale; // Handle retina

    NSArray* labels = [self findAllViewsToScale:self.contentView];
    for(UIView* view in labels) {
        view.contentScaleFactor = contentScale;
    }
}

答案 1 :(得分:1)

我遇到了同样的问题,上面的代码对我的情况不起作用。然后我按照文档说明:

  

如果您打算支持放大滚动视图,最常用的技术是使用包含滚动视图的整个contentSize的单个子视图,然后将其他子视图添加到该视图。这允许您将单个“集合”内容视图指定为要缩放的视图,并且其所有子视图将根据其状态进行缩放。

https://developer.apple.com/library/ios/#documentation/WindowsViews/Conceptual/UIScrollView_pg/CreatingBasicScrollViews/CreatingBasicScrollViews.html

的“添加子视图”部分

我只是创建了一个空视图,并将我的CATiledLayer和所有其他子视图添加到该空视图中。然后将该空视图添加为滚动视图的唯一子视图。而且,它就像一个魅力。这些方面的东西:

- (void)viewDidLoad
{
    _containerView = [[UIView alloc] init];
    [_containerView addSubView:_yourTiledView];
    for (UIView* subview in _yourSubviews) {
        [_containerView addSubView:subview];
    }
    [_scrollView addSubView:_containerView];
}

-(UIView*) viewForZoomingInScrollView:(UIScrollView*)scrollView {
    return _containerView;
}