0

私はアプリを開発しており、クライアントの注文を管理するアプリケーションを実装しています。このビューでは、Facebook スタイルのメニュー (ウィンドウ全体を右に移動すると表示される新しいメニュー) を実装し、右に移動したときにメイン ビューにグレースケール効果を追加しました。現在の画面の UIImage を作成し、それを実際のビューに追加して、アルファを 1 から 0 にアニメーション化することで、これを実現しました。使用したコードは次のとおりです。

-(void)toggleMenu {
    UIGraphicsBeginImageContext(self.view.bounds.size);
    [self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
    if (![menu isOpened]){
        UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        UIImage *blackAndWhiteImage = [UIImage getBlackAndWhiteVersionOfImage:viewImage];
        overlayImage = [[UIImageView alloc]initWithImage:blackAndWhiteImage];
        overlayImage.alpha = 0.1;
        overlayImage.userInteractionEnabled=NO;
        [self.view addSubview:overlayImage];
    }

    [UIView animateWithDuration:0.3 animations:^{
        CGRect newRect = [self tabBarController].view.frame;
        if (![menu isOpened]){
            newRect.origin.x += 150;
            [menu setOpened:YES];
            overlayImage.alpha = 1.0;
        } else {
            newRect.origin.x -= 150;
            [menu setOpened:NO];
            overlayImage.alpha = 0;
        }
        [self tabBarController].view.frame = newRect;

    } completion:^(BOOL finished){
        if(![menu isOpened]){
            [overlayImage removeFromSuperview];
            overlayImage = nil;
        }
    }];
}

問題は、アニメーション中のパフォーマンスに問題があることです (iPhone 4 では少しですが、次の時間に 3gs を試しています...)

より良いパフォーマンスを得るために何をすべきかについて何か提案はありますか? よろしく

+ (UIImage *)getBlackAndWhiteVersionOfImage:(UIImage *)anImage {
UIImage *newImage;

if (anImage) {
    CGColorSpaceRef colorSapce = CGColorSpaceCreateDeviceGray();
    CGContextRef context = CGBitmapContextCreate(nil, anImage.size.width * anImage.scale, anImage.size.height * anImage.scale, 8, anImage.size.width * anImage.scale, colorSapce, kCGImageAlphaNone);
    CGContextSetInterpolationQuality(context, kCGInterpolationHigh);
    CGContextSetShouldAntialias(context, NO);
    CGContextDrawImage(context, CGRectMake(0, 0, anImage.size.width, anImage.size.height), [anImage CGImage]);

    CGImageRef bwImage = CGBitmapContextCreateImage(context);
    CGContextRelease(context);
    CGColorSpaceRelease(colorSapce);

    UIImage *resultImage = [UIImage imageWithCGImage:bwImage];
    CGImageRelease(bwImage);

    UIGraphicsBeginImageContextWithOptions(anImage.size, NO, anImage.scale);
    [resultImage drawInRect:CGRectMake(0.0, 0.0, anImage.size.width, anImage.size.height)];
    newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
}

return newImage;

}

4

1 に答える 1

1

画面のイメージを作成するにはコストがかかります。どのような効果が必要なのか正確にはわかりませんが、代わりに別のビューをオーバーレイするか、代わりにメイン ビューの動きをアニメーション化します。

たとえば、背景が黒でアルファが 0.1 の UIView をオーバーレイして、領域を灰色にすることができます。

于 2011-11-23T14:47:49.467 に答える