¿Es posible leer el nombre de un UIImageView's
UIImage
que está almacenado actualmente en el UIImageView
?
Esperaba que pudieras hacer algo como esto, pero no lo he descubierto.
NSString *currentImageName = [MyIImageView getFileName];
ios
objective-c
swift
uiimageview
uiimage
Kuberchaun
fuente
fuente
puede usar el método setAccessibilityIdentifier para cualquier subclase de UIView
UIImageView *image ; [image setAccessibilityIdentifier:@"file name"] ; NSString *file_name = [image accessibilityIdentifier] ;
fuente
localize
método que simplemente pase por las imágenes y haga algunas expresiones regulares en el nombre de la imagen (tengo muy buenas razones para hacer esas imágenes imágenes reales en lugar de crear un UIImage personalizado) ... me preguntaba si había una forma mejor y más limpia de localizar imágenes en objetivo-c ... ya que todo el mundo está hablando de MVC y lo que noaccessibilityDescription
No no no… en general estas cosas son posibles. Simplemente te hará sentir como una persona sucia. Si es absolutamente necesario, haga esto:
Cree una categoría con su propia implementación
+imageNamed:(NSString*)imageName
que llame a la implementación existente y utilice la técnica identificada aquí ( ¿Cómo uso objc_setAssociatedObject / objc_getAssociatedObject dentro de un objeto? ) Para asociar permanentementeimageName
con el objeto UIImage que se devuelve.Utilice Method Swizzling para intercambiar la implementación proporcionada de
imageNamed:
para su implementación en la tabla de búsqueda de métodos del tiempo de ejecución de Objective-C.Acceda al nombre que asoció con la instancia de UIImage (usando objc_getAssociatedObject) cuando lo desee.
Puedo verificar que esto funciona, con la salvedad de que no se pueden cargar los nombres de UIImage en los NIB. Parece que las imágenes cargadas desde NIB no se crean a través de llamadas de función estándar, por lo que es realmente un misterio para mí.
Dejo la implementación en tus manos. Copiar y pegar código que se enrede con el tiempo de ejecución de Objective-C es una muy mala idea, así que piense detenidamente en las necesidades de su proyecto e impleméntelo solo si es necesario.
fuente
UIImage
para anular un método?+imageNamed:(NSString*)imageName { // save file name in new property or whatever [self imageNamed:imageName]; // infinite loop [super imageNamed:imageName]; // super doesn't contain such a method }
No existe una forma nativa de hacer esto; sin embargo, usted mismo podría crear fácilmente este comportamiento.
Puede crear
UIImageView
una subclase y agregar una nueva variable de instancia:NSString* imageFileName;
Luego puede anular
setImage
, primero configurandoimageFileName
el nombre de archivo de la imagen que está configurando y luego llamando[super setImage:imageFileName]
. Algo como esto:-(void) setImage:(NSString*)fileName { imageFileName = fileName; [super setImage:fileName]; }
El hecho de que no se pueda hacer de forma nativa no significa que no sea posible :)
fuente
if ([imageForCheckMark.image isEqual:[UIImage imageNamed:@"crossCheckMark.png"]]||[imageForCheckMark.image isEqual:[UIImage imageNamed:@"checkMark.png"]]) { }
fuente
hot dog
onot hotdog
.No No hay forma de hacerlo de forma nativa. Tendrá que crear una subclase de UIImageView y agregar una propiedad imageFileName (que establece cuando establece la imagen).
fuente
Ni UIImageView ni UIImage se aferran al nombre de archivo de la imagen cargada.
Tu también puedes
1: (como sugirió Kenny Winker arriba) subclase UIImageView para tener una propiedad fileName o
2: nombre los archivos de imagen con números (imagen1.jpg, imagen2.jpg, etc.) y etiquete esas imágenes con el número correspondiente (etiqueta = 1 para imagen1.jpg, etiqueta = 2 para imagen2.jpg, etc.) o
3: Tenga una variable de nivel de clase (por ejemplo, NSString * currentFileName) que se actualice cada vez que actualice la imagen de UIImageView
fuente
Este código te ayudará a: -
- (NSString *)getFileName:(UIImageView *)imgView{ NSString *imgName = [imgView image].accessibilityIdentifier; NSLog(@"%@",imgName); return imgName; }
Utilice esto como: -
NSString *currentImageName = [self getFileName:MyIImageView];
fuente
[image setAccessibilityIdentifier:@"demoFileName.png"] ;
O puede usar el identificador de restauración, así:
let myImageView = UIImageView() myImageView.image = UIImage(named: "anyImage") myImageView.restorationIdentifier = "anyImage" // Same name as image's name! // Later, in UI Tests: print(myImageView.restorationIdentifier!) // Prints "anyImage"
Básicamente, en esta solución, está utilizando el identificador de restauración para mantener el nombre de la imagen, por lo que puede usarlo más tarde en cualquier lugar. Si actualiza la imagen, también debe actualizar el identificador de restauración, así:
myImageView.restorationIdentifier = "newImageName"
Espero que te ayude, ¡buena suerte!
fuente
Sí, puede comparar con la ayuda de datos como el siguiente código
UITableViewCell *cell = (UITableViewCell*)[self.view viewWithTag:indexPath.row + 100]; UIImage *secondImage = [UIImage imageNamed:@"boxhover.png"]; NSData *imgData1 = UIImagePNGRepresentation(cell.imageView.image); NSData *imgData2 = UIImagePNGRepresentation(secondImage); BOOL isCompare = [imgData1 isEqual:imgData2]; if(isCompare) { //contain same image cell.imageView.image = [UIImage imageNamed:@"box.png"]; } else { //does not contain same image cell.imageView.image = secondImage; }
fuente
Puede utilizar la función Object C Runtime para asociar el nombre de la imagen con UImageView.
Primera importación
#import <objc/runtime.h>
en su claseluego implemente su código de la siguiente manera:
NSString *filename = @"exampleImage"; UIImage *image = [UIImage imagedName:filename]; objc_setAssociatedObject(image, "imageFilename", filename, OBJC_ASSOCIATION_COPY); UIImageView *imageView = [[UIImageView alloc] initWithImage:image]; //You can then get the image later: NSString *filename = objc_getAssociatedObject(imageView, "imageFilename");
Espero que te ayude.
fuente
Obtener el nombre de la imagen Swift 4.2
Existe una forma si desea comparar los nombres de las imágenes de los botones que tiene en los activos.
@IBOutlet weak var extraShotCheckbox: UIButton! @IBAction func extraShotCheckBoxAction(_ sender: Any) { extraShotCheckbox.setImage(changeCheckBoxImage(button: extraShotCheckbox), for: .normal) } func changeCheckBoxImage(button: UIButton) -> UIImage { if let imageView = button.imageView, let image = imageView.image { if image == UIImage(named: "checkboxGrayOn") { return UIImage(named: "checkbox")! } else { return UIImage(named: "checkboxGrayOn")! } } return UIImage() }
fuente
Primero establezca el accessibilityIdentifier como imageName
myImageView.image?.accessibilityIdentifier = "add-image"
Luego use el siguiente código.
extension UIImageView { func getFileName() -> String? { // First set accessibilityIdentifier of image before calling. let imgName = self.image?.accessibilityIdentifier return imgName } }
Finalmente, la forma de llamada del método para identificar
myImageView.getFileName()
fuente
Me he ocupado de este problema, lo resolvió el patrón de diseño MVC, creé la clase de tarjeta:
@interface Card : NSObject @property (strong,nonatomic) UIImage* img; @property (strong,nonatomic) NSString* url; @end
// luego en
UIViewController
elDidLoad
Método a hacer:// init Cards Card* card10= [[Card alloc]init]; card10.url=@"image.jpg"; card10.img = [UIImage imageNamed:[card10 url]];
// por ejemplo
UIImageView * myImageView = [[UIImageView alloc]initWithImage:card10.img]; [self.view addSubview:myImageView];
// tal vez quieras comprobar el nombre de la imagen, para que puedas hacer esto:
//por ejemplo
NSString * str = @"image.jpg"; if([str isEqualToString: [card10 url]]){ // your code here }
fuente
utilizar a continuación
UIImageView *imageView = ((UIImageView *)(barButtonItem.customView.subviews.lastObject)); file_name = imageView.accessibilityLabel;
fuente
El código funciona en swift3: escriba el código dentro del método delegado didFinishPickingMediaWithInfo:
if let referenceUrl = info[UIImagePickerControllerReferenceURL] as?
NSURL {
ALAssetsLibrary().asset(for: referenceUrl as URL!, resultBlock: { asset in let fileName = asset?.defaultRepresentation().filename() print(fileName!) //do whatever with your file name }, failureBlock: nil) }
fuente