Ios 压倒一切;位图缩放“;UIScrollView缩放的效果
在我的iPad应用程序(新布局分支)中,我有一个UIView子类(UCLLineChartView),它包含一个UIScrollView,而scrollview又包含另一个UIView子类(ChartView)。ChartView有多个子层,添加到图表中的每行数据对应一个子层。UCLLineChartView绘制轴和标记。这些视图/图层的内容完全是自定义绘制的,不使用库存视图(例如UIImageView) 我在缩放方面遇到了一个问题——它像图像一样缩放图表视图,这使得绘制的线变得模糊和拉伸。我希望线路保持清晰,最好是在用户进行缩放时,但经过3天的黑客攻击后,我无法让它工作 如果我在图表视图上覆盖setTransform以从变换中获取比例因子,但不调用Ios 压倒一切;位图缩放“;UIScrollView缩放的效果,ios,cocoa-touch,uiscrollview,uikit,Ios,Cocoa Touch,Uiscrollview,Uikit,在我的iPad应用程序(新布局分支)中,我有一个UIView子类(UCLLineChartView),它包含一个UIScrollView,而scrollview又包含另一个UIView子类(ChartView)。ChartView有多个子层,添加到图表中的每行数据对应一个子层。UCLLineChartView绘制轴和标记。这些视图/图层的内容完全是自定义绘制的,不使用库存视图(例如UIImageView) 我在缩放方面遇到了一个问题——它像图像一样缩放图表视图,这使得绘制的线变得模糊和拉伸。我希
[super setTransform]
,则scrollview的缩放比例保持在1。我尝试保留给定的转换并重写转换方法以返回它。我尝试通过更改图表视图的中心和边界来复制setTransform的效果,但我无法完全正确地执行该操作,而且它似乎仍然不会影响scrollview的zoomScale。scrollview的zoomScale似乎取决于setTransform的效果,但我无法确定如何使用
非常感谢您的帮助。您需要做的是更新图表视图的
contentScaleFactor
。您可以通过在scrollViewDidEndZooming:withView:atScale:
或scrollViewDidZoom:
中添加以下代码来完成此操作
CGFloat newScale = scrollView.zoomScale * [[UIScreen mainScreen] scale];
[self.chartView setContentScaleFactor:newScale];
您需要做的是更新图表视图的
contentScaleFactor
。您可以通过在scrollViewDidEndZooming:withView:atScale:
或scrollViewDidZoom:
中添加以下代码来完成此操作
CGFloat newScale = scrollView.zoomScale * [[UIScreen mainScreen] scale];
[self.chartView setContentScaleFactor:newScale];
我已经想出了一个解决我问题的办法,这个办法不算太粗俗。在您的UIScrollViewDelegate中:
- (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)view
{
[_contentView beginZoom];
}
- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale
{
CGSize size = scrollView.bounds.size;
CGPoint contentOffset = _scrollView.contentOffset;
CGFloat newScale = _contentView.scale;
newScale = MAX(newScale, kMinZoomScale);
newScale = MIN(newScale, kMaxZoomScale);
[_scrollView setZoomScale:1.0 animated:NO];
_scrollView.minimumZoomScale = kMinZoomScale / newScale;
_scrollView.maximumZoomScale = kMaxZoomScale / newScale;
_contentView.scale = newScale;
CGSize newContentSize = CGSizeMake(size.width * newScale, size.height);
_contentView.frame = CGRectMake(0, 0, newContentSize.width, newContentSize.height);
_scrollView.contentSize = newContentSize;
[_scrollView setContentOffset:contentOffset animated:NO];
[_contentView updateForNewSize];
[_contentView setNeedsDisplay];
}
在内容视图中,声明缩放特性和以下方法:
- (void)beginZoom
{
_sizeAtZoomStart = CGSizeApplyAffineTransform(self.frame.size, CGAffineTransformMakeScale(1/self.scale, 1));
_scaleAtZoomStart = self.scale;
}
- (void)setTransform:(CGAffineTransform)transform
{
self.scale = _scaleAtZoomStart * transform.a;
self.frame = CGRectMake(0, 0, _sizeAtZoomStart.width * self.scale, _sizeAtZoomStart.height);
[self updateForNewSize];
[self setNeedsDisplay];
}
如果内容视图使用子层,则需要通过向子层的委托添加以下内容来禁用其隐式动画:
-(id)actionForLayer:(CALayer*)layer-forKey:(NSString*)事件
{
//防止单个层的动画,以便缩放不会导致奇怪的抖动
返回(id)[NSNull];
}
这里的基本思想是,重写的setTransform使用变换矩阵中的比例因子来计算内容视图的新比例因子,然后相应地调整内容视图的大小。scrollview会自动调整内容偏移以保持内容视图居中
ScrollViewDiEndZooming代码保持缩放范围
例如,在旋转设备时调整滚动视图的大小会有更多的复杂性。我已经找到了一个解决问题的方法,这不是一个太严重的问题。在您的UIScrollViewDelegate中:
- (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)view
{
[_contentView beginZoom];
}
- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale
{
CGSize size = scrollView.bounds.size;
CGPoint contentOffset = _scrollView.contentOffset;
CGFloat newScale = _contentView.scale;
newScale = MAX(newScale, kMinZoomScale);
newScale = MIN(newScale, kMaxZoomScale);
[_scrollView setZoomScale:1.0 animated:NO];
_scrollView.minimumZoomScale = kMinZoomScale / newScale;
_scrollView.maximumZoomScale = kMaxZoomScale / newScale;
_contentView.scale = newScale;
CGSize newContentSize = CGSizeMake(size.width * newScale, size.height);
_contentView.frame = CGRectMake(0, 0, newContentSize.width, newContentSize.height);
_scrollView.contentSize = newContentSize;
[_scrollView setContentOffset:contentOffset animated:NO];
[_contentView updateForNewSize];
[_contentView setNeedsDisplay];
}
在内容视图中,声明缩放特性和以下方法:
- (void)beginZoom
{
_sizeAtZoomStart = CGSizeApplyAffineTransform(self.frame.size, CGAffineTransformMakeScale(1/self.scale, 1));
_scaleAtZoomStart = self.scale;
}
- (void)setTransform:(CGAffineTransform)transform
{
self.scale = _scaleAtZoomStart * transform.a;
self.frame = CGRectMake(0, 0, _sizeAtZoomStart.width * self.scale, _sizeAtZoomStart.height);
[self updateForNewSize];
[self setNeedsDisplay];
}
如果内容视图使用子层,则需要通过向子层的委托添加以下内容来禁用其隐式动画:
-(id)actionForLayer:(CALayer*)layer-forKey:(NSString*)事件
{
//防止单个层的动画,以便缩放不会导致奇怪的抖动
返回(id)[NSNull];
}
这里的基本思想是,重写的setTransform使用变换矩阵中的比例因子来计算内容视图的新比例因子,然后相应地调整内容视图的大小。scrollview会自动调整内容偏移以保持内容视图居中
ScrollViewDiEndZooming代码保持缩放范围
例如,在旋转设备时,调整滚动视图的大小会更加复杂。这没有明显的效果。这不是视图到设备坐标映射的问题。UIScrollView将缩放变换应用于正在缩放的视图。我想避免这种情况,但仍然可以通过重画获得缩放效果,这样我的图表视图就可以用新的帧大小重画线条。这没有明显的效果。这不是视图到设备坐标映射的问题。UIScrollView将缩放变换应用于正在缩放的视图。我想避免这种情况,但仍然可以通过重画获得缩放效果,这样我的图表视图就可以用新的帧大小重画线条。我知道这已经很晚了,但我也遇到了同样的问题,通过将“最小和最大缩放”值设置为0.2和1.0,而不是1.0和5.0(放大到5倍),解决了这个问题。显然有,;我知道这已经晚了,但我也遇到了同样的问题,通过将最小和最大缩放值设置为0.2和1.0,而不是1.0和5.0(放大到5倍),解决了这个问题。显然有,;这要比这多一些,但这应该给读者一个开始。