UIImageView - Wie der Dateiname des Bildes zugewiesen werden?
-
20-09-2019 - |
Frage
Ist es möglich, den Namen einer UIImageView's
UIImage
zu lesen
das ist derzeit in der UIImageView
gespeichert?
Ich hatte gehofft, Sie etwas ein bisschen wie dies tun könnte, aber noch nicht herausgefunden.
NSString *currentImageName = [MyIImageView getFileName];
Lösung
Nein. Sie können das nicht tun.
Der Grund dafür ist, dass eine UIImageView
Instanz keine Bilddatei speichert. Es speichert eine zeigt eine UIImage
Instanz. Wenn Sie ein Bild aus einer Datei zu machen, können Sie etwas tun, wie folgt aus:
UIImage *picture = [UIImage imageNamed:@"myFile.png"];
Sobald dies geschehen ist, gibt es nicht mehr jede Bezugnahme auf die Dateinamen. Die UIImage
Instanz enthält die Daten, unabhängig davon, wo sie es. So könnte der UIImageView
nicht möglicherweise die Dateinamen kennen.
Auch wenn Sie könnten, würden Sie niemals Dateinamen info aus einer Sicht bekommen. Dass Umbrüche MVC.
Andere Tipps
Sie können setAccessibilityIdentifier Methode für jede Unterklasse von UIView verwenden
UIImageView *image ;
[image setAccessibilityIdentifier:@"file name"] ;
NSString *file_name = [image accessibilityIdentifier] ;
Nein, nein, nein ... im Allgemeinen sind diese Dinge möglich. Es wird nur Sie wie eine schmutzige Person fühlen. Wenn Sie unbedingt, dies zu tun:
-
Erstellen Sie eine Kategorie mit Ihrer eigenen Implementierung von
+imageNamed:(NSString*)imageName
, dass Anrufe durch an die bestehenden Implementierung und die Technik hier identifizierten Verwendungen ( Wie verwende ich objc_setAssociatedObject / objc_getAssociatedObject innerhalb eines Objekts? ) dauerhaft zu assoziierenimageName
mit dem UIImage-Objekt, das zurückgegeben wird. -
Verwenden Sie Methode Swizzling die bereitgestellte Implementierung von
imageNamed:
für Ihre Implementierung in der Methode Lookup zu tauschen Tabelle der Objective-C-Laufzeit. -
Rufen Sie den Namen, den Sie mit der UIImage-Instanz zugeordnet (mit objc_getAssociatedObject), wann immer Sie es wollen.
kann ich überprüfen, ob das funktioniert, mit dem Vorbehalt, dass Sie nicht die Namen der UIImage des in NIBs geladen bekommen. Es scheint, dass Bilder von NIBs geladen werden, nicht durch irgendwelche Standardfunktionsaufrufe erstellt, also ist es wirklich ein Rätsel für mich.
Ich verlasse die Umsetzung bis zu Ihnen. Copy-Code einfügen, dass die Schrauben mit der Objective-C-Laufzeit eine sehr schlechte Idee ist, so denken Sie sorgfältig über Ihr Projekt Bedürfnisse und implementieren dies nur, wenn Sie müssen.
Es gibt keine native Möglichkeit, dies zu tun; jedoch könnte man leicht dieses Verhalten selbst erstellen.
Sie können UIImageView
Unterklasse und eine neue Instanz Variable hinzu:
NSString* imageFileName;
Dann könnte man setImage
, erste Einstellung imageFileName
an den Dateinamen des Bildes du bist Einstellung außer Kraft setzen, und dann ruft [super setImage:imageFileName]
. So etwas wie folgt aus:
-(void) setImage:(NSString*)fileName
{
imageFileName = fileName;
[super setImage:fileName];
}
Nur weil es nicht nativ ausgeführt werden, bedeutet nicht, es ist nicht möglich:)
if ([imageForCheckMark.image isEqual:[UIImage imageNamed:@"crossCheckMark.png"]]||[imageForCheckMark.image isEqual:[UIImage imageNamed:@"checkMark.png"]])
{
}
Nein. Auf keinen Fall, dass nativ zu tun. Du wirst UIImageView haben, um eine Unterklasse, und fügen Sie eine Eigenschaft imagefilename (die Sie festlegen, wenn Sie das Bild gesetzt).
Weder UIImageView nicht UIImage hält an den Dateinamen des Bildes geladen.
Sie können entweder
1: (wie oben von Kenny Winkern vorgeschlagen) Unterklasse UIImageView eine Eigenschaft File-Namen zu haben, oder
2: benennen Sie die Bilddateien mit den Nummern (image1.jpg, image2.jpg usw.) und Tag diese Bilder mit der entsprechenden Nummer (tag = 1 für image1.jpg, tag = 2 für image2.jpg usw.) oder
3: (. ZB NSString * Current) Haben Sie eine Klassenstufe Variable, die Updates, wenn Sie das Bild des UIImageView aktualisieren
Dieser Code wird Ihnen helfen: -
- (NSString *)getFileName:(UIImageView *)imgView{
NSString *imgName = [imgView image].accessibilityIdentifier;
NSLog(@"%@",imgName);
return imgName;
}
Verwenden Sie diese als: -
NSString *currentImageName = [self getFileName:MyIImageView];
Ja, Sie können mit Hilfe von Daten, wie unter Code
vergleichenUITableViewCell *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;
}
Sie können mit dem UImageView zum Assoziieren Bildnamen Ziel c Runtime-Funktion verwenden.
Ersteinfuhr #import <objc/runtime.h>
in der Klasse
dann implementieren Sie den Code wie folgt:
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");
Hope hilft es Ihnen.
Sie können auch die Wiederherstellung Bezeichner verwenden, wie folgt aus:
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"
Im Grunde genommen in dieser Lösung, die Sie mit der Wiederherstellung Kennung des Image des Namen zu halten, so dass Sie es später überall verwenden können. Wenn Sie das Bild aktualisieren, müssen Sie auch die Wiederherstellung Kennung aktualisieren, wie folgt aus:
myImageView.restorationIdentifier = "newImageName"
Ich hoffe, das hilft Ihnen, viel Glück!
Swift 3
Sie zuerst die accessibilityIdentifier als imagename
myImageView.image?.accessibilityIdentifier = "add-image"
Verwenden Sie dann den folgenden Code ein.
extension UIImageView
{
func getFileName() -> String? {
// First set accessibilityIdentifier of image before calling.
let imgName = self.image?.accessibilityIdentifier
return imgName
}
}
Schließlich Die anrufende Art und Weise des Verfahrens zu identifizieren
myImageView.getFileName()
Get Bild Name Swift 4.2
Es gibt einen Weg, wenn Sie Taste Bildnamen vergleichen wollen, dass Sie in Assets haben.
@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()
}
Ich habe mit diesem Problem um, ich war es von MVC-Entwurfsmuster gelöst, habe ich Karten-Klasse:
@interface Card : NSObject
@property (strong,nonatomic) UIImage* img;
@property (strong,nonatomic) NSString* url;
@end
// dann in der UIViewController
in der DidLoad
Methode zu tun:
// init Cards
Card* card10= [[Card alloc]init];
card10.url=@"image.jpg";
card10.img = [UIImage imageNamed:[card10 url]];
// für Beispiel
UIImageView * myImageView = [[UIImageView alloc]initWithImage:card10.img];
[self.view addSubview:myImageView];
// können Sie die Bildnamen überprüfen, so können Sie dies tun:
// zum Beispiel
NSString * str = @"image.jpg";
if([str isEqualToString: [card10 url]]){
// your code here
}
Verwendung unter
UIImageView *imageView = ((UIImageView *)(barButtonItem.customView.subviews.lastObject));
file_name = imageView.accessibilityLabel;
Der Code ist Arbeit in swift3 - Schreib Code innerhalb didFinishPickingMediaWithInfo Delegatmethode:
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)
}