Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/118.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 压倒一切;位图缩放“;UIScrollView缩放的效果_Ios_Cocoa Touch_Uiscrollview_Uikit - Fatal编程技术网

Ios 压倒一切;位图缩放“;UIScrollView缩放的效果

Ios 压倒一切;位图缩放“;UIScrollView缩放的效果,ios,cocoa-touch,uiscrollview,uikit,Ios,Cocoa Touch,Uiscrollview,Uikit,在我的iPad应用程序(新布局分支)中,我有一个UIView子类(UCLLineChartView),它包含一个UIScrollView,而scrollview又包含另一个UIView子类(ChartView)。ChartView有多个子层,添加到图表中的每行数据对应一个子层。UCLLineChartView绘制轴和标记。这些视图/图层的内容完全是自定义绘制的,不使用库存视图(例如UIImageView) 我在缩放方面遇到了一个问题——它像图像一样缩放图表视图,这使得绘制的线变得模糊和拉伸。我希

在我的iPad应用程序(新布局分支)中,我有一个UIView子类(UCLLineChartView),它包含一个UIScrollView,而scrollview又包含另一个UIView子类(ChartView)。ChartView有多个子层,添加到图表中的每行数据对应一个子层。UCLLineChartView绘制轴和标记。这些视图/图层的内容完全是自定义绘制的,不使用库存视图(例如UIImageView)

我在缩放方面遇到了一个问题——它像图像一样缩放图表视图,这使得绘制的线变得模糊和拉伸。我希望线路保持清晰,最好是在用户进行缩放时,但经过3天的黑客攻击后,我无法让它工作

如果我在图表视图上覆盖setTransform以从变换中获取比例因子,但不调用
[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倍),解决了这个问题。显然有,;这要比这多一些,但这应该给读者一个开始。