我有一个带有子UIView(CATiledLayer)的UIScrollView - 然后我有更多关于该视图的子视图(其中一些是UITextViews)
缩放后,一切都很模糊。
我已经阅读了关于这个主题的各种文章,它们似乎都表明我必须处理scrollViewDidEndZooming然后'做一些变换的东西,搞乱框架并调整内容偏移'。请有人能让我摆脱痛苦,并解释这是如何起作用的。
提前致谢...
答案 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的单个子视图,然后将其他子视图添加到该视图。这允许您将单个“集合”内容视图指定为要缩放的视图,并且其所有子视图将根据其状态进行缩放。
我只是创建了一个空视图,并将我的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;
}