Czy można odczytać nazwę, UIImageView's
UIImage
która jest obecnie przechowywana w UIImageView
?
Miałem nadzieję, że możesz zrobić coś takiego, ale nie rozgryzłem tego.
NSString *currentImageName = [MyIImageView getFileName];
ios
objective-c
swift
uiimageview
uiimage
Kuberchaun
źródło
źródło
możesz użyć metody setAccessibilityIdentifier dla dowolnej podklasy UIView
UIImageView *image ; [image setAccessibilityIdentifier:@"file name"] ; NSString *file_name = [image accessibilityIdentifier] ;
źródło
localize
metodę, która po prostu przejdzie przez obrazy i zrobi kilka wyrażeń regularnych na nazwie obrazu (mam bardzo dobre powody, aby te obrazy rzeczywistych obrazów zamiast tworzenia niestandardowego UIImage) .. zastanawiałem się, czy istnieje lepszy i czystszy sposób lokalizacji obrazów w obiektywnym-c .. skoro wszyscy mówią o MVC, a co nieaccessibilityDescription
Nie, nie, nie… generalnie te rzeczy są możliwe. Po prostu poczujesz się jak brudna osoba. Jeśli absolutnie musisz, zrób to:
Utwórz kategorię z własną implementacją
+imageNamed:(NSString*)imageName
tych wywołań do istniejącej implementacji i użyj techniki określonej w tym miejscu ( Jak używać obiektu objc_setAssociatedObject / objc_getAssociatedObject w obiekcie? ), Aby trwale powiązaćimageName
z zwracanym obiektem UIImage.Użyj metody Swizzling, aby zamienić dostarczoną implementację
imageNamed:
dla swojej implementacji w tabeli wyszukiwania metod środowiska uruchomieniowego Objective-C.Uzyskaj dostęp do nazwy skojarzonej z instancją UIImage (za pomocą objc_getAssociatedObject) w dowolnym momencie.
Mogę sprawdzić, czy to działa, z zastrzeżeniem, że nie można załadować nazw UIImage do NIB. Wygląda na to, że obrazy ładowane z NIB-ów nie są tworzone przez żadne standardowe wywołania funkcji, więc jest to dla mnie naprawdę tajemnicą.
Wdrożenie pozostawiam Tobie. Kopiowanie i wklejanie kodu, który wkręca się w środowisko uruchomieniowe Objective-C, jest bardzo złym pomysłem, więc zastanów się dokładnie nad potrzebami projektu i wdrażaj to tylko wtedy, gdy musisz.
źródło
UIImage
aby zastąpić metodę?+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 }
Nie ma na to rodzimego sposobu; jednak możesz łatwo stworzyć to zachowanie samodzielnie.
Możesz podklasować
UIImageView
i dodać nową zmienną instancji:NSString* imageFileName;
Następnie możesz nadpisać
setImage
, najpierw ustawiającimageFileName
nazwę pliku obrazu, który ustawiasz, a następnie dzwoniąc[super setImage:imageFileName]
. Coś takiego:-(void) setImage:(NSString*)fileName { imageFileName = fileName; [super setImage:fileName]; }
To, że nie można tego zrobić natywnie, nie oznacza, że jest to niemożliwe :)
źródło
if ([imageForCheckMark.image isEqual:[UIImage imageNamed:@"crossCheckMark.png"]]||[imageForCheckMark.image isEqual:[UIImage imageNamed:@"checkMark.png"]]) { }
źródło
hot dog
czynot hotdog
.Nie. Nie można tego zrobić natywnie. Będziesz musiał podklasę UIImageView i dodać właściwość imageFileName (którą ustawisz podczas ustawiania obrazu).
źródło
Ani UIImageView, ani UIImage nie przechowuje nazwy załadowanego obrazu.
Możesz albo
1: (zgodnie z sugestią Kenny'ego Winkera powyżej) podklasa UIImageView, aby mieć właściwość fileName lub
2: nazwij pliki graficzne numerami (zdjęcie1.jpg, zdjęcie2.jpg itp.) I oznacz te obrazy odpowiednim numerem (tag = 1 dla obrazu1.jpg, tag = 2 dla obrazu2.jpg itp.) Lub
3: Miej zmienną na poziomie klasy (np. NSString * currentFileName), która jest aktualizowana za każdym razem, gdy aktualizujesz obraz UIImageView
źródło
Ten kod pomoże ci: -
- (NSString *)getFileName:(UIImageView *)imgView{ NSString *imgName = [imgView image].accessibilityIdentifier; NSLog(@"%@",imgName); return imgName; }
Użyj tego jako: -
NSString *currentImageName = [self getFileName:MyIImageView];
źródło
[image setAccessibilityIdentifier:@"demoFileName.png"] ;
a następnie wywołaj tę metodęMożesz też użyć identyfikatora przywrócenia, na przykład:
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"
Zasadniczo w tym rozwiązaniu używasz identyfikatora przywracania do przechowywania nazwy obrazu, dzięki czemu możesz go później użyć w dowolnym miejscu. Jeśli zaktualizujesz obraz, musisz również zaktualizować identyfikator przywracania, na przykład:
myImageView.restorationIdentifier = "newImageName"
Mam nadzieję, że ci to pomoże, powodzenia!
źródło
Tak, możesz porównać dane, takie jak poniższy kod
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; }
źródło
Możesz użyć funkcji Objective c Runtime do skojarzenia nazwy obrazu z UImageView.
Pierwszy import
#import <objc/runtime.h>
w Twojej klasienastępnie zaimplementuj swój kod jak poniżej:
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");
Mam nadzieję, że ci to pomoże.
źródło
Pobierz nazwę obrazu Swift 4.2
Jest sposób, jeśli chcesz porównać nazwy obrazów przycisków, które masz w zasobach.
@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() }
źródło
Najpierw ustaw accessibilityIdentifier jako imageName
myImageView.image?.accessibilityIdentifier = "add-image"
Następnie użyj następującego kodu.
extension UIImageView { func getFileName() -> String? { // First set accessibilityIdentifier of image before calling. let imgName = self.image?.accessibilityIdentifier return imgName } }
Wreszcie, wywołujący sposób metody identyfikacji
myImageView.getFileName()
źródło
Zajmowałem się tym problemem, rozwiązałem go za pomocą wzorca projektowego MVC, stworzyłem klasę Card:
@interface Card : NSObject @property (strong,nonatomic) UIImage* img; @property (strong,nonatomic) NSString* url; @end
// następnie w
UIViewController
wDidLoad
Metodzie zrobić:// init Cards Card* card10= [[Card alloc]init]; card10.url=@"image.jpg"; card10.img = [UIImage imageNamed:[card10 url]];
// na przykład
UIImageView * myImageView = [[UIImageView alloc]initWithImage:card10.img]; [self.view addSubview:myImageView];
// możesz sprawdzić nazwę obrazu, więc możesz to zrobić:
//na przykład
NSString * str = @"image.jpg"; if([str isEqualToString: [card10 url]]){ // your code here }
źródło
użyj poniżej
UIImageView *imageView = ((UIImageView *)(barButtonItem.customView.subviews.lastObject)); file_name = imageView.accessibilityLabel;
źródło
Kod działa w swift3 - napisz kod wewnątrz metody delegata 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) }
źródło