如何访问drawRect中绘制的圆圈?

时间:2015-03-31 17:24:42

标签: ios uiview uikit drawing customization

所以,我有自定义视图,其中我画了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];
}

2 个答案:

答案 0 :(得分:0)

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

@property (nonatomic, strong) UIColor *colorOfView;

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

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

答案 1 :(得分:0)

扩展您已收到的答案/评论......

  1. 这样做的简单方法肯定会有效
  2. 如果你想为你的圈子设置动画,那么你需要每隔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中作为IBOutlet引用View类。然后,您可以在ViewController中直接读取或设置这些视图属性。 (在ViewController中创建对View的引用比反之亦然容易得多)。您的NSTimer将位于ViewController中,而不是View。

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

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

      总而言之,我首先尝试选项1,看看它是否足够快以给你流畅的动画。如果没有,请尝试选项2(除了更改颜色之外)比听起来更容易。

      祝你好运