хочу "избежать" анимационных эффектов подкласса UIView - PullRequest
0 голосов
/ 24 октября 2009

Я хочу создать «закругленный» «полупрозрачный» 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 ]

2 голосов
/ 24 октября 2009

Вот как я это сделал в приложении Cocoa Touch, над которым я работал:

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

Не уверен, что это лучший способ сделать это (или он будет работать даже вне среды iPhone), так как я сам немного новичок в Какао. Хотя стоит попробовать.

1 голос
/ 25 октября 2009

Начиная с версии 3.0, вы можете легко получить любые углы обзора:

1) Установите clipsToBounds на YES.

2) установите view.layer.cornerRadius на какое-то значение (5.0 очень хорошо, но вы можете играть со значениями). Это также требует от вас #import <QuartzCore/QuartzCore.h> в файле, где вы устанавливаете это свойство.

Все сделано!

Если вы используете IB для определения представлений, вы можете установить обрезку подпредставления в IB, но вы не можете изменять свойства слоя, поэтому вам придется добавить эту часть в viewDidLoad или где-то подобное.

1 голос
/ 24 октября 2009

Использование анимации UIView из drawRect не имеет смысла. Кроме того, невозможно отключить анимацию путем перезаписи свойств UIView, поскольку CoreAnimation анимирует свойства слоя, а не вида. Если альфа исчезает при использовании одного из ваших представлений, проблема не в реализации вашего класса, а в том, откуда она вызывается. Некоторый окружающий код сделал [UIView beginAnimations] перед установкой альфа вашего представления или супер-представления.

Отключите все анимации, вы можете использовать метод, предложенный Дэвидом.

...