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];
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];
Odpowiedzi:
Nie. Nie możesz tego zrobić.
Powodem jest to, że UIImageView
instancja nie przechowuje pliku obrazu. Przechowuje wyświetla UIImage
instancję. Kiedy tworzysz obraz z pliku, robisz coś takiego:
UIImage *picture = [UIImage imageNamed:@"myFile.png"];
Po wykonaniu tej czynności nie ma już odniesienia do nazwy pliku. UIImage
Instancja zawiera dane, bez względu na to, gdzie dostał. Dlatego UIImageView
prawdopodobnie nie mogli znać nazwy pliku.
Ponadto, nawet gdybyś mógł, nigdy nie uzyskałbyś informacji o nazwie pliku z widoku. To łamie MVC.
możesz użyć metody setAccessibilityIdentifier dla dowolnej podklasy UIView
UIImageView *image ;
[image setAccessibilityIdentifier:@"file name"] ;
NSString *file_name = [image accessibilityIdentifier] ;
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 nie
accessibilityDescription
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.
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ąc imageFileName
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 :)
if ([imageForCheckMark.image isEqual:[UIImage imageNamed:@"crossCheckMark.png"]]||[imageForCheckMark.image isEqual:[UIImage imageNamed:@"checkMark.png"]])
{
}
hot dog
czy not 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).
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
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];
[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!
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;
}
Możesz użyć funkcji Objective c Runtime do skojarzenia nazwy obrazu z UImageView.
Pierwszy import #import <objc/runtime.h>
w Twojej klasie
nastę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.
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()
}
Szybki 3
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()
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
w DidLoad
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
}
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)
}