【问题标题】:How I could get access to circles drawn in drawRect?如何访问在 drawRect 中绘制的圆圈?
【发布时间】:2015-03-31 17:24:41
【问题描述】:

所以,我有自定义视图,我在其中画了 3 个圆圈。我如何将“colorView”作为参数传递?其他人从 IB(而不是代码)添加了所有这些视图。我怎样才能改变这些圈子的框架或可见性?我可以为他们添加变量吗?谢谢你。

- (void)drawRect:(CGRect)rect
{
        CGContextRef con = UIGraphicsGetCurrentContext();

        CGContextSetFillColorWithColor(con, colorOfView.CGColor);
        CGContextFillEllipseInRect(con, CGRectMake(0,10,85,85));

        CGContextSetFillColorWithColor(con, [UIColor clearColor].CGColor);
        CGContextSetBlendMode(con, kCGBlendModeClear); // erase
        CGContextFillEllipseInRect(con, CGRectMake(62, -1, 35, 35));

        CGContextSetFillColorWithColor(con, colorOfView.CGColor);
        CGContextSetBlendMode(con, kCGBlendModeNormal);
        CGContextFillEllipseInRect(con, CGRectMake(65,0,30,30));
}

现在我使用其他方法更新颜色:

- (void)setCustomTitle:(NSString *)title andIcon:(NSString *)iconName andCircle:(UIColor *)color
{
    self.titleLabel.text = title;
    self.iconImage.image = [UIImage imageNamed:iconName];
    colorOfView = color;
    self.circleView.backgroundColor = color;
    [self setNeedsDisplay];
}

【问题讨论】:

    标签: ios uiview uikit drawing customization


    【解决方案1】:

    你应该为你的颜色创建一个属性:

    @property (nonatomic, strong) UIColor *colorOfView;
    

    然后将colorOfView = color改为self.colorOfView = color

    并将CGContextSetFillColorWithColor(con, colorOfView.CGColor); 更改为CGContextSetFillColorWithColor(con, self.colorOfView.CGColor);

    【讨论】:

    • 我的问题的第二部分是...主要问题是接收对圆圈的访问... GContextFillEllipseInRect(con, CGRectMake(65,0,30,30));
    • 我不确定您所说的接收访问权限是什么意思。你想完成什么?
    • 我需要一种方法来制作圆、半径和颜色的动画。因此,当我添加视图时,圆的半径为 10,之后我想更改为 50。
    • 如果您需要为半径和颜色设置动画,我会考虑使用 CAShapeLayer 和使用 UIBezierPath 创建的路径并为其设置动画 fillColortransform 而不是绘制圆圈在drawRect:
    • 请提供一个样本作为答案(mb代表一个圆圈)。
    【解决方案2】:

    扩展您已经收到的答案/cmets ...

    1. 这样做的简单方法肯定会奏效

    如果你想为你的圆圈设置动画,那么你需要每隔 1/50 秒左右调用一次 drawRec。这样做的方法是使用 NSTimer 在每一帧之间“等待”你的循环。这可以在 ViewController 或 View 中。绘制视图后,设置另一个 NSTimer 实例再等待 20 毫秒(不重复)。委托触发重绘(setNeedsDisplay),然后实例化另一个 NSTimer 以等待另外 20 毫秒,依此类推。如果您希望动画停止,则无需实例化另一个 NSTimer。

    不要只是不停地调用 setNeedsRefresh ,否则你会发现你的 ViewController 将变得无响应,因为所有 CPU 周期都将用于刷新。而且它会在不同的硬件上以非常不同的速度运行。

    至于如何在 ViewController 中访问圆圈大小等,您有两种选择。首先,您可以将需要圆圈大小的代码移动到 drawRec 中,在这种情况下,您还可以在视图中处理 NSTimer 实例(和委托),您的问题就会消失。

    其次,(并且可能更好)您可以在 View .h 文件中将圆圈大小、颜色等设置为属性。使用 Interface Builder(故事板)和 Assistant Editor 在 ViewController 中获取对 View 类的引用作为 IBOutlet。然后,您可以从 ViewController 中直接读取或设置这些视图属性。 (在 ViewController 中创建对 View 的引用比反之更容易)。您的 NSTimer 将在您的 ViewController 中,而不是在您的 View 中。

    如果您的圈子很大,那么您可能会对刷新率感到失望。

    1. 完成大部分工作的稍微困难但速度更快的方法

    正如 Dan 指出的那样,可能有更好的方法。您可以将您的圈子设置为 ImageView 中的图像(非常类似于 View,但请注意您不能对 ImageView 执行 drawRec)。然后,您可以通过设置 UIImageView 的框架为位置、大小、透明度和旋转设置动画。优点是效率更高(转换基本上是在硬件中完成的)。对于尺寸,画一个大圆圈并按比例缩小,这样你就不会出现锯齿。据我所知,你不能直接改变颜色,但你可以设置一个圆形的切口并将它用作你使用 memset (或快速的东西)的矩形的蒙版填写正确的颜色。这很复杂,如果您需要更改颜色,我肯定会先尝试选项 1。您应该阅读 https://developer.apple.com/library/ios/qa/qa1708/_index.html 以了解此选项的一般工作原理以及为什么它比选项 1 更好。

    所以总的来说,我会先尝试选项 1,看看它是否足够快,可以为您提供流畅的动画效果。如果没有,请尝试选项 2,它(除了更改颜色)比听起来更容易。

    祝你好运

    【讨论】:

    • 实际上有一个 kludge 可以让选项 2 改变颜色。在彼此的顶部设置 3 个圆圈作为 3 个不同的 ImageView,一个红色、一个绿色和一个蓝色。然后使用每一层的透明度来合成你的颜色。这仍然会比在 drawRect 中绘制圆圈更快。
    猜你喜欢
    • 2021-10-15
    • 2014-04-11
    • 2012-09-19
    • 1970-01-01
    • 1970-01-01
    • 2022-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多