想要“避免”UIView子类的动画效果

时间:2009-10-24 08:33:51

标签: iphone uiview subclass

我想创建“圆形”“半透明”UIView(或任何类似的东西) 我的下面的代码导致动画效果,逐渐改变透明密度。 我想要的是避免这种效果,并从头开始直接绘制结果图像。

谁能知道该怎么做? 谢谢。

- (id)initWithFrame:(CGRect)frame 
{
    if (self = [super initWithFrame:frame]) 
    {
        // Initialization code
        super.opaque = NO;
        self.alpha = 1.0f;
        self.strokeColor = kDefaultStrokeColor;
        super.backgroundColor = [UIColor clearColor];
        self.rectColor = kDefaultRectColor;
        self.strokeWidth = kDefaultStrokeWidth;
        self.cornerRadius = kDefaultCornerRadius;
        self.contentMode = UIViewContentModeRedraw;
        self.clearsContextBeforeDrawing = NO;
    }
    return self;
}
- (void)setBackgroundColor:(UIColor *)newBGColor
{
    // Ignore attempt to set backgroundColor
}
- (void)setOpaque:(BOOL)newIsOpaque
{
    // Ignore attempt to set opaque to YES.
}
- (void)drawRect:(CGRect)rect {
    BOOL areEnabled = [UIView areAnimationsEnabled];

    // with or without setAnimationsEnabled:NO gives me the same result
    [UIView setAnimationsEnabled:NO];

        // with or without beginAnimations and commitAnimations gives me the same result
    [UIView beginAnimations:@"test" context:nil];

    [UIView setAnimationRepeatCount:1];
//  [UIView setAnimationBeginsFromCurrentState:YES];

    // With or without setAnimationDelay gives me the same result
    //[UIView setAnimationDelay:0.0f];
        // With or without setAnimationDuration gives me the same result
        // passing 0.0f the same
    //[UIView setAnimationDuration:0.1f];


    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextBeginPath(context);

    CGContextSetLineWidth(context, strokeWidth);
    CGContextSetStrokeColorWithColor(context, self.strokeColor.CGColor);
    CGContextSetFillColorWithColor(context, self.rectColor.CGColor);

    CGRect rrect = self.bounds;

    CGFloat radius = cornerRadius;
    CGFloat width = CGRectGetWidth(rrect);
    CGFloat height = CGRectGetHeight(rrect);

    // Make sure corner radius isn't larger than half the shorter side
    if (radius > width/2.0)
        radius = width/2.0;
    if (radius > height/2.0)
        radius = height/2.0;    

    CGFloat minx = CGRectGetMinX(rrect);
    CGFloat midx = CGRectGetMidX(rrect);
    CGFloat maxx = CGRectGetMaxX(rrect);
    CGFloat miny = CGRectGetMinY(rrect);
    CGFloat midy = CGRectGetMidY(rrect);
    CGFloat maxy = CGRectGetMaxY(rrect);
    CGContextMoveToPoint(context, minx, midy);
    CGContextAddArcToPoint(context, minx, miny, midx, miny, radius);
    CGContextAddArcToPoint(context, maxx, miny, maxx, midy, radius);
    CGContextAddArcToPoint(context, maxx, maxy, midx, maxy, radius);
    CGContextAddArcToPoint(context, minx, maxy, minx, midy, radius);
    CGContextClosePath(context);
    CGContextDrawPath(context, kCGPathFillStroke);
    CGContextClip(context); 

   [UIView commitAnimations];

   [UIView setAnimationsEnabled:areEnabled];

   // I am stacked...   
}

3 个答案:

答案 0 :(得分:2)

以下是我在Cocoa Touch应用程序中完成的工作:

[CATransaction begin];
[CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions];
// Change opacity (or whatever) here.
[CATransaction commit];

不确定这是否是最佳方式(或者它甚至可以在iPhone环境之外工作),因为我自己有点像Cocoa新手。但值得一试。

答案 1 :(得分:1)

在drawRect中使用UIView动画毫无意义。此外,由于CoreAnimation为图层而不是视图属性设置动画,因此无法通过覆盖UIView属性来禁用动画。如果使用其中一个视图时alpha会消失,则问题不在于classe的实现,而是在调用它的位置。在设置视图或超级视图的alpha之前,某些周围代码执行了[UIView beginAnimations]

禁用所有动画,您可以使用David提出的方法。

答案 2 :(得分:1)

从3.0开始,您可以轻松地查看圆角:

1)将clipsToBounds设为YES

2)将view.layer.cornerRadius设置为某个值(5.0非常好,但您可以使用值)。这还需要您在设置此属性的文件中#import <QuartzCore/QuartzCore.h>

全部完成!

如果您使用IB来定义视图,则可以在IB中设置子视图剪辑,但不能修改图层属性,因此您必须在viewDidLoad或类似的地方添加该部分。