26

そのため、SwipeView ライブラリ ( https://github.com/nicklockwood/SwipeView ) を使用して、iOS8 の Photos フレームワークを使用して画像を表示しています。

ただし、requestImageForAsset を呼び出すと、2 つの結果、サムネイル サイズ、および必要な大きいサイズが得られることに気付きました。ただし、大きな画像は返されるまでにロードされないため(非同期と呼ばれます)、小さな画像が返されます。

このコードはもっと理にかなっているかもしれません。

    func swipeView(swipeView: SwipeView!, viewForItemAtIndex index: Int, reusingView view: UIView!) -> UIView! {
            let asset: PHAsset = self.photosAsset[index] as PHAsset

    var imageView: UIImageView!

    let screenSize: CGSize = UIScreen.mainScreen().bounds.size
    let targetSize = CGSizeMake(screenSize.width, screenSize.height)


    var options = PHImageRequestOptions()
//        options.deliveryMode = PHImageRequestOptionsDeliveryMode.Opportunistic
    options.resizeMode = PHImageRequestOptionsResizeMode.Exact


    PHImageManager.defaultManager().requestImageForAsset(asset, targetSize: targetSize, contentMode: .AspectFill, options: options, resultHandler: {(result, info)in
        println("huhuhuh")
        println(result.size)
        println(info)
        imageView = UIImageView(image: result)
    })
    println("setting view)
    return imageView
}

ログ出力は次のとおりです。

Enteredhuhuhuh
(33.5,60.0)
SETTING VIEW
huhuhuh
(320.0,568.0)

ご覧のとおり、大きな画像が受信される前に画像ビューが返されます。サムネが表示されないように、この大きな画像を返すにはどうすればよいですか?

ありがとう。

4

8 に答える 8

91

PHImageManagerクラスのヘッダーを読む

-[PHImageRequestOptions isSynchronous の場合] が NO (または options が nil) を返す場合、resultHandler は 1 回以上呼び出される可能性があります。通常、この場合、resultHandler は要求された結果を使用してメイン スレッドで非同期に呼び出されます。ただし、deliveryMode = PHImageRequestOptionsDeliveryModeOpportunistic の場合、画像データがすぐに利用可能であれば、resultHandler を呼び出しスレッドで同期的に呼び出すことができます。この最初のパスで返された画像データの品質が不十分な場合、resultHandler は後でメイン スレッドで非同期に再度呼び出され、「正しい」結果が得られます。リクエストがキャンセルされた場合、resultHandler がまったく呼び出されない可能性があります。-[PHImageRequestOptions isSynchronous] が YES を返す場合、resultHandler は呼び出しスレッドで同期的に一度だけ呼び出されます。同期リクエストはキャンセルできません。

だから、あなたがしたいことは、あなたresultHandlerが呼ばれるようにすることですsynchronously

PHImageRequestOptions *option = [PHImageRequestOptions new];
option.synchronous = YES;

[[PHImageManager defaultManager] requestImageForAsset:asset targetSize:target contentMode:PHImageContentModeAspectFill options:option resultHandler:^(UIImage *result, NSDictionary *info) {
        //this block will be called synchronously
}];

したがって、メソッドを終了する前にブロックが呼び出されます

幸運を!

于 2014-12-30T07:00:48.397 に答える
4

resultHandler:PHImageResultIsDegradedKeyブロックには、結果の画像が要求された画像の低品質の代替品であるかどうかを示すキーのブール値を含む情報ディクショナリがあります。

ドキュメントの内容は次のとおりです。

PHImageResultIsDegradedKey:結果の画像が要求された画像の低品質の代替品であるかどうかを示すブール値。(NS番号)

YES の場合、resultHandler ブロックの結果パラメーターには低品質の画像が含まれています。これは、Photos がまだ高品質の画像を提供できていないためです。リクエストで提供した PHImageRequestOptions オブジェクトの設定に応じて、Photos は結果ハンドラー ブロックを再度呼び出して、より高品質の画像を提供する場合があります。

于 2015-10-07T18:04:50.410 に答える
4

デフォルトではrequestImageForAsset、非同期として動作します。したがって、メソッドでは、画像が取得される前でも return ステートメントが実行されます。したがって、私の提案は、imageView を返す代わりに、imageView を渡して、画像を入力する必要があることです。

func swipeView(swipeView: SwipeView!, viewForItemAtIndex index: Int, reusingView view: UIView!, yourImageView: UIImageView)
{
    let asset: PHAsset = self.photosAsset[index] as PHAsset

    var imageView: UIImageView! = yourImageView;

    let screenSize: CGSize = UIScreen.mainScreen().bounds.size
    let targetSize = CGSizeMake(screenSize.width, screenSize.height)


    var options = PHImageRequestOptions()
    options.resizeMode = PHImageRequestOptionsResizeMode.Exact

    PHImageManager.defaultManager().requestImageForAsset(asset, targetSize: targetSize, contentMode: .AspectFill, options: options, resultHandler: {(result, info)in
        imageView.image = result;
    })
}

ノート:

もう 1 つのオプションは、resultHandler からの結果イメージで通知を起動することです。しかし、私は上記の方法を好みます。

詳細については、 PHImageManagerを参照してください。

于 2014-12-30T07:01:41.930 に答える
1

この方法については、Apple のドキュメントを参照してください。その中で、彼らは次のように言っています。

非同期リクエストの場合、Photos は結果ハンドラ ブロックを複数回呼び出す場合があります。Photos は、最初にブロックを呼び出して、高品質の画像を準備する間、一時的に表示するのに適した低品質の画像を提供します。(低品質の画像データがすぐに利用できる場合、メソッドが戻る前に最初の呼び出しが発生する可能性があります。)

あなたの場合、元のサイズの画像を取得するのに時間がかかる場合があります。そうでなければ、あなたのコードは私には問題ないようです。

于 2014-12-30T06:15:03.590 に答える
0

以下のオプションを使用、swift 3.0

publi var imageRequestOptions: PHImageRequestOptions{
let options = PHImageRequestOptions()
options.version = .current
options.resizeMode = .exact
options.deliveryMode = .highQualityFormat
options.isNetworkAccessAllowed = true
options.isSynchronous = true
return options}
于 2017-02-08T09:29:19.340 に答える