gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 17:00:33 25 4
gpt4 key购买 nike

我正在尝试围绕 UIView 创建一个 "marching ants" (an animated dashed line) selection indicator,其中包含 UIImageView subview 。使用核心图形在 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);
}

但是,我需要使用仿射变换来缩放(和旋转) View ,以便内部的 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];
}

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

作为界面元素,选择选取框应保持固定宽度和固定大小的破折号。我尝试过旋转和缩放主视图的 UIImageView subview ,但这会导致 UIImageView 超出 super View 。

我可以想到一些蛮力方法来正确绘制选取框。我可以跟踪 View 的绝对大小,然后在每次重绘时重新计算最终用户空间单位,或者每次使用 UIImageView 时创建一个带有选择选取框的新 View 。但这些解决方案不够优雅且容易出现错误。

我想我错过了文档中有关如何在 UIView 中绘制和转换图形的内容。

[更新:我认为使用行军 Ant 在 iPhone 的小屏幕上没有用,所以我采用了另一种方法。不过,我仍然对这个特定问题的解决方案感兴趣。]

最佳答案

我认为您没有错过文档中的任何内容,但您可能错过了缩放提供的想法。如果缩放 View 或图层的内容,它将调整内容中所有内容的大小。这实际上是可取的。它使缩放变得很容易,而无需自己管理所有 subview 缩放。听起来您需要的是在 View 前面添加一个覆盖层。

我不确定您如何导致 View 调整大小,但是当您的 View 加载时,添加一个覆盖核心动画层,您可以随着 View 的缩放调整其大小。请注意,在提到覆盖层时,我使用了“调整大小”一词,而不是“缩放”。

为了使其正常工作,您必须确保覆盖层是您正在缩放的​​ View 的同级而不是 subview ,否则它也会被缩放。

有趣的是,您可以使用 CAShapeLayer 并利用其 lineDashPattern 属性,该属性采用 float 组来指定可以勾勒出您指定的 CGRect 轮廓的虚线图案。然后可以使用 lineDashPhase 属性和 CABasicAnimation 为该图案设置动画,从而赋予其行进的 Ant 效果。如果您感兴趣,我可以详细说明这一点。

更新:我继续并 wrote a blog post on getting the marching ants effect working using Core Animation 。抱歉,我没有时间尝试解决您的问题,但这篇博客文章可能会帮助您指出正确的方向。

关于iphone - 如何防止或补偿核心图形路径的缩放变换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1574516/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com