ios - Marco de fotos. requestImageForAsset devolviendo dos resultados. No se puede configurar la vista de imagen
uiimageview uicollectionview (7)
Así que estoy usando la biblioteca SwipeView ( https://github.com/nicklockwood/SwipeView ) para mostrar imágenes usando el marco de fotos para iOS8.
Sin embargo, cuando llamo a requestImageForAsset, me doy cuenta de que obtengo dos resultados, un tamaño de miniatura y el tamaño más grande que deseo. Sin embargo, la imagen más grande no se carga (se llama asíncrono, entiendo) a tiempo para volver, por lo que devuelve la imagen pequeña.
Este código podría tener más sentido.
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
}
Aquí está la salida del registro:
Enteredhuhuhuh
(33.5,60.0)
SETTING VIEW
huhuhuh
(320.0,568.0)
Como puede ver, devuelve la vista de la imagen antes de que se reciba la imagen grande. ¿Cómo puedo hacer que devuelva esta imagen más grande para que no muestre el dedo pulgar?
Gracias.
Utilice las siguientes opciones, 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}
Consulte la documentación de Apple para este método here. En eso están diciendo:
Para una solicitud asíncrona, las fotos pueden llamar al bloqueo del controlador de resultados más de una vez. Las fotos primero llaman al bloque para proporcionar una imagen de baja calidad adecuada para mostrarse temporalmente mientras se prepara una imagen de alta calidad. (Si los datos de imagen de baja calidad están disponibles de inmediato, la primera llamada puede ocurrir antes de que el método regrese).
Puede tomar tiempo, en su caso para obtener una imagen de tamaño original. De lo contrario su código me parece bien.
De forma predeterminada, el requestImageForAsset
funciona como asíncrono. Por lo tanto, en su método, la declaración de retorno se ejecutará incluso antes de recuperar la imagen. Por lo tanto, mi sugerencia es que, en lugar de devolver la imagen, pase la imagen en la que necesita rellenar la imagen:
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;
})
}
Nota:
Otra opción es que puede activar una notificación con la imagen resultante del resultado Handler. Pero prefiero el método antes mencionado.
Consulte PHImageManager para más información.
Intenta esto también funcionará para asincrónicamente.
[[PHImageManager defaultManager] requestImageForAsset:asset targetSize:target contentMode:PHImageContentModeAspectFill options:option resultHandler:^(UIImage *result, NSDictionary *info) {
if ([info objectForKey:@"PHImageFileURLKey"]) {
//your code
}
}];
Lea el encabezado de la clase PHImageManager
Si - [PHImageRequestOptions isSynchronous ] devuelve NO (o las opciones son nulas), el administrador de resultados puede llamarse 1 o más veces. Normalmente, en este caso, se llamará a resultHandler de forma asíncrona en el hilo principal con los resultados solicitados. Sin embargo, si deliveryMode = PHImageRequestOptionsDeliveryModeOpportunistic, resulthandler resultante se puede llamar de forma síncrona en el subproceso de llamada si hay datos de imagen disponibles de inmediato. Si los datos de imagen que se devuelven en esta primera pasada no tienen una calidad suficiente, se volverá a llamar a resultHandler, de forma asíncrona en el hilo principal en un momento posterior con los resultados "correctos". Si se cancela la solicitud, no se puede llamar a resultHandler en absoluto. Si - [PHImageRequestOptions isSynchronous] devuelve YES, se llamará a resultHandler exactamente una vez, de forma síncrona y en el subproceso de llamada. Las solicitudes sincrónicas no pueden ser canceladas. resultHandler para solicitudes asíncronas, siempre llamadas en el hilo principal
Entonces, lo que quieres hacer es que hagas que el resultHandler
de resultados se llame de forma 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
}];
Entonces tu bloque será llamado antes de terminar tu método.
¡Buena suerte!
No debe volver a escribir imageView dentro del bloque, solo configure la imagen y todo debería funcionar como espera. Para evitar mostrar dos imágenes, puede verificar el tamaño de la imagen antes de asignar.
var imageView = UIImageView()
...
...
PHImageManager.defaultManager().requestImageForAsset(asset, targetSize: targetSize, contentMode: .AspectFill, options: options, resultHandler: {(result, info)in
println("huhuhuh")
println(result.size)
println(info)
if result.size.width > 1000 && result.size.height > 1000 { // add any size you want
imageView.setImage(result)
}
})
resultHandler:
bloque tiene un diccionario de información que puede contener un valor booleano para la clave PHImageResultIsDegradedKey
, que indica si la imagen resultante es un sustituto de baja calidad para la imagen solicitada.
Esto es lo que dice la documentación:
PHImageResultIsDegradedKey: un valor booleano que indica si la imagen resultante es un sustituto de baja calidad para la imagen solicitada. (NSNumber)
Si es SÍ, el parámetro de resultado de su resultado El bloque Handler contiene una imagen de baja calidad porque Fotos aún no pudo proporcionar una imagen de mayor calidad. Según las configuraciones en el objeto PHImageRequestOptions que proporcionó con la solicitud, es posible que Photos vuelva a llamar al bloque del controlador de resultados para proporcionar una imagen de mayor calidad.