代码之家  ›  专栏  ›  技术社区  ›  TechZen

如何防止或补偿核心图形路径的缩放转换?

  •  1
  • TechZen  · 技术社区  · 15 年前

    我正在尝试创建一个 "marching ants" (an animated dashed line) selection indicator 在包含uiImageView子视图的uiView周围。使用核心图形围绕uiview的周界绘制虚线非常简单:

    -(void) drawSelectedMarquee{
         CGContextRef c=UIGraphicsGetCurrentContext();
     CGContextSetStrokeColorWithColor(c, [[UIColor whiteColor] CGColor] );
     CGRect f=self.bounds;
     CGContextSetLineWidth(c, 2.0);
     CGFloat dashes[]={1,2};
     CGContextSetLineDash(c, 0, dashes, 2);
     CGContextBeginPath(c);
     CGContextAddRect(c, f);
     CGContextStrokePath(c);
    }
    

    但是,我需要使用仿射变换缩放(和旋转)视图,以便内部的uiImageView可以缩放和旋转:

    -(void) scaleByX:(CGFloat) xScale andY:(CGFloat) yScale{
     [UIView beginAnimations:nil context:nil];
     [UIView setAnimationDuration:0.1];
     [UIView setAnimationBeginsFromCurrentState:YES];
     self.transform=CGAffineTransformScale(self.transform, xScale, yScale);
     [UIView commitAnimations];
    }
    

    但是,由于核心图形绘制的是相对的“用户空间点”,这些点显然也是通过变换缩放的,因此缩放视图会使虚线按比例缩放。因此,当视图比例变小时,线条变细,虚线靠得更近,视图比例变大,线条变粗,虚线分开。

    作为一个界面元素,选择框应该保持固定宽度和固定大小的破折号。我试过旋转和缩放主视图的uiImageView子视图,但这会导致uiImageView缩小到超视图之外。

    我可以想出一些蛮力的方法来恰当地绘制天棚。我可以跟踪视图的绝对大小,然后在每次重新绘制时重新计算最终用户的空间单位,或者每次使用uiImageView创建带有选择框的新视图。但这些解决方案不美观,而且容易出错。

    我想我在有关如何在uiview中绘制和转换图形的文档中遗漏了一些东西。

    [最新消息:我已经决定在iPhone的小屏幕上使用行军蚂蚁是没有用的,所以我采用了另一种方法。不过,我仍然对这个特定问题的解决方案感兴趣。]

    3 回复  |  直到 12 年前
        1
  •  2
  •   Matt Long    15 年前

    我不认为您遗漏了文档中的任何内容,但是您可能遗漏了扩展提供什么的概念。如果缩放视图或图层的内容,则会调整内容中的所有内容的大小。这实际上是可取的。它使得不必管理所有子视图就可以轻松地进行缩放。听起来您需要的是在视图前面添加一个覆盖层。

    我不确定您是如何使视图调整大小的,但是当视图加载时,添加一个覆盖核心动画层,您可以随着视图比例调整其大小。注意,我在引用覆盖层时使用了“调整大小”而不是“缩放”。

    要使其正确工作,您必须确保覆盖层是您正在缩放的视图的同级,而不是子视图,否则它也将被缩放。

    有趣的是,您可以使用cashapelayer并利用它的linedashpattern属性,该属性使用一个浮点数组来指定一个可以勾勒您指定的cgrect的短划线模式。然后可以使用linedashphase属性和一个cabasicanization为该模式设置动画,使其具有行军蚂蚁效果。如果你感兴趣的话,我可以详细说明。

    更新:我继续 wrote a blog post on getting the marching ants effect working using Core Animation . 抱歉,我没有时间来解决你的问题,但是博客文章可能会帮助你找到正确的方向。

        2
  •  1
  •   Kurt Horimoto    12 年前

    您可能需要检查正在进行核心图形绘制的视图的内容模式。我最近遇到了一个问题,在可变高度的TableView单元格中有垂直虚线,其比例与您描述的相似。如果将ContentMode设置为uiViewContentModedRaw,则应在帧更改时使用DrawRect手动绘制视图,而不是缩放它。

        3
  •  0
  •   unknown    15 年前

    我认为你可以逆变换来做你想做的。如果我在这一点上是错的,那么如果你知道你的尺度和翻译值,你应该能够构建相反的转换。

    另一种方法是绘制到图层上,而不是直接绘制到视图中,并且只缩放图层。

    在许多应用程序(如AdobeIllustrator)中,矩形天棚实际上是主窗口前面的一个透明窗口。