1

だから私はこの機能を使ってUIWebView電子書籍を読み込んでいる写真を撮り、ユーザーがページをレンダリングしている間にそれを表示しています

-(UIImage*)captureScreen:(UIView*) viewToCapture
{

    UIGraphicsBeginImageContextWithOptions(viewToCapture.bounds.size, viewToCapture.opaque, 0.0);
    [viewToCapture.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return viewImage;
}

しかし、画像を取得するために遅延(0.5秒)があるという問題が発生しました..時間プロファイラーでテストすると、機器 [viewToCapture.layer renderInContext:UIGraphicsGetCurrentContext()];は遅延の原因となっているものとしてこの行を指しています..アドバイス、提案どうすれば来ることができますかこの遅れ。

ありがとうございます。

注: 1.本の効果に UIPageController を使用しています。

2.私が試したことを確認するには、このリンクを確認してください

4

2 に答える 2

1

あなたはGCDを使うことができます-私はあなたが与えたリンクのGCDから欠落しているステップに気づきました。これは、私が非同期で画像を取得し、準備ができて正常に動作したときに通知するために使用するものです。

dispatch_queue_t concurrent = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
    dispatch_async(concurrent, ^{
        __block UIImage *image = nil;
        dispatch_sync(concurrent, ^{
            //put code to grab image here
        });
        dispatch_sync(dispatch_get_main_queue(), ^{
            //this gets called when the above is finshed
            //you should also check if the image is nil or not
        });
    }); 

それが役に立てば幸い

記録のために-私はUIViewスナップショットを撮るためにこれを使用し、一時的であっても常にターゲットを親ビュー内に配置しようとします-それはそれをスピードアップするようです。

UIGraphicsBeginImageContextWithOptions(self.bounds.size, YES, 0.0);
[self.layer renderInContext:UIGraphicsGetCurrentContext()];

UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;

それが役立つかどうか、または同じアプローチを使用しているかどうかはわかりません。私はあなたがこれをすぐに解決することを願っています:)

于 2012-05-03T13:26:35.830 に答える
1

これを解決する最善の方法は、デリゲートを使用することです。つまり、デリゲート メソッドに画像を作成するように指示すると、バックグラウンドでそれが実行され、ビューに「ねえ、今、XXX の画像を取得しました」と伝えられます (実装方法によって異なります。この方法で、電子書籍を表示して、デフォルトの背景で本の真ん中にローダーを表示するだけです. 画像が完成したら、正しい画像で本のビューを更新し、ローダーを削除します. Appleの方法と同じように. iBooks やその他の優れたアプリケーションはすべてそうです。

私自身のプロジェクトの 1 つからの例 (必要に応じて調整されていますが、UITableViewController で使用するためのものです):
BookDelegate.h

#import <Foundation/Foundation.h>

@class Book;

@protocol BookDelegate <NSObject>

@optional
- (void)didRecieveImageForBook:(NSString*)imagePath indexPath:(NSIndexPath*)indexPath;

@end

Book.h

#import <Foundation/Foundation.h>
#import "BookDelegate.h"

@interface Book : NSOperation <NSObject>
{   
    id <BookDelegate> delegate;
    SEL didRecieveImageForBookSelector;
}

@property (strong, nonatomic) id delegate;
@property (assign) SEL didRecieveImageForBookSelector;

- (NSString*)getBookImageForBookId:(int)BookId externalRefference:(NSString*)url indexPath:(NSIndexPath*)indexPath;
- (id)delegate;

// Delegate methods
- (void)didRecieveImageForBook:(NSString*)imagePath indexPath:(NSIndexPath*)indexPath;

@end

Book.m

#import "Book.h"
#import <objc/runtime.h>

@implementation Book

static char kAssociationKey;

@synthesize didRecieveImageForBookSelector;
@synthesize delegate;

- (id)init
{
    if (self = [super init])
    {
        [self setDidRecieveImageForBookSelector:@selector(didRecieveImageForBook:indexPath:)];
    }
    return self;
}

#pragma mark -
#pragma mark The default delegate functions

- (void)didRecieveImageForBook:(NSString*)imagePath indexPath:(NSIndexPath*)indexPath
{
    NSLog(@"********************************************************");
    NSLog(@"*** PLEASE IMPLEMENT THE FOLLOWING DELEGATE FUNCTION ***");
    NSLog(@"***       didRecieveImageForBook:indexPath:       ***");
    NSLog(@"********************************************************");
}

#pragma mark -
#pragma mark Function for fechting images

// This method is not adapted to what YOU need, but left my code here in case it might help you out.
- (NSString*)getBookImageForBookId:(int)bookId externalRefference:(NSString*)url indexPath:(NSIndexPath*)indexPath
{    
    NSString *ext = [[url lastPathComponent] pathExtension];

    NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];

    NSString *imagePath = [documentsPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@%d.%@", APP_BookIMAGEPEFIX, BookId, ext]];
    BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:imagePath];

    if (fileExists)
    {
        return imagePath;
    }
    else {
        NSURL *theUrl = [NSURL URLWithString:url];

        ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:theUrl];
        [request setDidFinishSelector:@selector(BookImageFetched:)];
        [request setDidFailSelector:@selector(processFailed:)];
        [request setTimeOutSeconds:60];
        [request setDownloadDestinationPath:imagePath];
        [request setDelegate:self];

        [request startAsynchronous];

        objc_setAssociatedObject(request, &kAssociationKey, indexPath, OBJC_ASSOCIATION_RETAIN_NONATOMIC);

        return @"";
    }
}

- (void)BookImageFetched:(ASIHTTPRequest *)request 
{
    NSIndexPath *indexPath = objc_getAssociatedObject(request, &kAssociationKey);
    NSString *imagePath = request.downloadDestinationPath;

    [[self delegate] performSelector:self.didRecieveImageForBookSelector withObject:imagePath withObject:indexPath];
}

#pragma mark -
#pragma mark delegate functions

- (id)delegate
{
        return delegate;
}

- (void)setDelegate:(id)newDelegate
{
        delegate = newDelegate;
}

#pragma mark -

@end
于 2012-05-03T13:23:04.453 に答える