【问题标题】:drawRect: crash by big rect after zommingdrawRect:缩放后大直立崩溃
【发布时间】:2012-10-26 12:18:48
【问题描述】:

我的 UIView 结构: 我有一个"master" UIView(实际上是UIScrollView,但它只是为了按分页滚动)。 作为"master" 的子视图,我有我的"pageView"UIScrollView 的子类)。这个UIScrollView 可以有任何内容(例如 UIImageView)。 "master" 有另一个子视图:PaintView(UIView 的子类)。通过这个视图,我跟踪手指的运动并绘制它。

结构如下:

[master.view addSubview: pageView];
[master.view addSubview: paintView];

我知道用户何时放大(pageView 对此负责)和委托/方法调用我根据缩放更改在缩放操作期间更改paintView 的框架。 缩放后(scrollViewDidEndZooming:withView:atScale)调用paintView的自定义重绘方法。

重绘方法和drawRect:

-(void)redrawForScale:(float)scale {
    for (UIBezierPath *path in _pathArray) {
        //TransformMakeScale...
    }
    [self setNeedsDisplay];
} 

-(void)drawRect:(CGRect)rect {
    for (UIBezierPath *path in _pathArray) {
        [path strokeWithBlendMode:kCGBlendModeNormal alpha:1.0];
    } 
}

问题: 当我放大时,我收到内存警告并且应用程序崩溃。

在分配分析器中,我可以看到应用程序拥有大量内存,但我不明白为什么。 当我在 'redrawForScale' 方法之后不调用 'setNeedDisplay' 时,应用程序不会崩溃。

当我在 drawRect 中记录矩形时,我看到如下值:{{0, 0.299316}, {4688, 6630}}。

【问题讨论】:

    标签: objective-c quartz-core


    【解决方案1】:

    问题是(重新)绘制如此巨大的 CGRect(如果这是错误的,请纠正我)。 我的解决方案是避免调用自定义 drawRect 方法。在一些 stackoverflow 答案中(我认为是在 Appls 文档中的某处)提到自定义 drawRect: 会降低性能(因为 iOS 无法对自定义 drawRect 方法施展魔法)。

    我的解决方案: 使用CAShapeLayer。对于每个 UIBezierPath,我都会创建一个 CAShapeLayer 实例,将 UIBezierPath 添加到图层的 path 属性中,并将图层作为子图层添加到我的视图中。

    CAShapeLayer *shapeLayer = [[CAShapeLayer alloc] initWithLayer:self.layer];
    shapeLayer.lineWidth = 10.0;
    shapeLayer.strokeColor = [UIColor blackColor].CGColor;
    shapeLayer.fillColor = [UIColor clearColor].CGColor;
    shapeLayer.path = myBezierPath.CGPath;
    [self.layer addSublayer:shapeLayer];
    

    有了这个解决方案,我不需要实现 drawRect。所以应用程序不会崩溃,即使使用很大的 maximumZoomScale。

    更改 UIBezierPath(平移、缩放、更改颜色)后,我需要再次将更改后的 bezierPath 设置为 shapeLayer(再次设置 shapeLayer 的path 属性)。

    【讨论】:

      猜你喜欢
      • 2021-02-28
      • 2023-03-28
      • 1970-01-01
      • 2011-08-30
      • 2015-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-12
      相关资源
      最近更新 更多