UIImageView's
UIImage
Şu anda içinde saklanan birinin adını okumak mümkün mü UIImageView
?
Böyle bir şey yapabileceğini umuyordum ama henüz çözemedim.
NSString *currentImageName = [MyIImageView getFileName];
UIImageView's
UIImage
Şu anda içinde saklanan birinin adını okumak mümkün mü UIImageView
?
Böyle bir şey yapabileceğini umuyordum ama henüz çözemedim.
NSString *currentImageName = [MyIImageView getFileName];
Yanıtlar:
Hayır! Bunu yapamazsınız.
Bunun nedeni, bir UIImageView
örneğin bir görüntü dosyasını saklamamasıdır. Bir UIImage
örneği saklar . Bir dosyadan bir görüntü oluşturduğunuzda, şöyle bir şey yaparsınız:
UIImage *picture = [UIImage imageNamed:@"myFile.png"];
Bu yapıldıktan sonra artık dosya adına herhangi bir referans yoktur. UIImage
Örneğin olursa olsun got it nerede, veri içerir. Bu nedenle, UIImageView
dosya adını muhtemelen bilemezler.
Ayrıca, yapabilseniz bile, bir görünümden asla dosya adı bilgisi alamazsınız. Bu MVC'yi bozar.
herhangi bir UIView alt sınıfı için setAccessibilityIdentifier yöntemini kullanabilirsiniz
UIImageView *image ;
[image setAccessibilityIdentifier:@"file name"] ;
NSString *file_name = [image accessibilityIdentifier] ;
localize
basitçe resimlerin üzerinden geçen ve resim adı üzerinde bazı normal ifadeler yapan bir yöntem oluşturmak istiyorum (bunları yapmak için çok iyi nedenlerim var özel yapılmış bir UIImage oluşturmak yerine görüntüler gerçek görüntüler) .. objektif-c'de görüntüleri yerelleştirmenin daha temiz bir yolu olup olmadığını merak ediyordum çünkü herkes MVC hakkında konuşuyor ve ne değil
accessibilityDescription
Hayır hayır hayır… genel olarak bu şeyler mümkündür. Kendini kirli biri gibi hissettirecek. Kesinlikle mecbursanız, şunu yapın:
+imageNamed:(NSString*)imageName
Mevcut uygulamaya giden çağrıların kendi uygulamanızla bir kategori oluşturun ve burada tanımlanan tekniği ( objc_setAssociatedObject / objc_getAssociatedObject öğesini bir nesnenin içinde nasıl kullanabilirim? ) imageName
Döndürülen UIImage nesnesiyle kalıcı olarak ilişkilendirmek için kullanın .
Objective-C çalışma zamanının yöntem arama tablosunda, uygulamanız için sağlanan uygulamayı değiştirmek üzere Method Swizzling'i kullanın imageNamed:
.
UIImage örneğiyle ilişkilendirdiğiniz ada (objc_getAssociatedObject kullanarak) istediğiniz zaman erişin.
NIB'lere yüklenen UIImage adlarını alamadığınız uyarısıyla bunun çalıştığını doğrulayabilirim. Görünüşe göre NIB'lerden yüklenen görüntüler herhangi bir standart işlev çağrısı yoluyla oluşturulmuyor, bu yüzden bu benim için gerçekten bir muamma.
Uygulamayı size bırakıyorum. Objective-C çalışma zamanıyla vidalanan kodu kopyalayıp yapıştırmak çok kötü bir fikirdir, bu nedenle projenizin ihtiyaçları hakkında dikkatlice düşünün ve bunu yalnızca gerekiyorsa uygulayın.
UIImage
bir yöntemi geçersiz kılmak için bir alt sınıf oluşturmuyorsunuz ?
+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 }
Bunu yapmanın yerel bir yolu yoktur; ancak, bu davranışı kendiniz kolayca oluşturabilirsiniz.
Alt sınıfa ayırabilir UIImageView
ve yeni bir örnek değişkeni ekleyebilirsiniz:
NSString* imageFileName;
Sonra geçersiz kılabilirsiniz setImage
, önce ayarladığınız imageFileName
görüntünün dosya adını ayarlayabilir ve ardından çağırabilirsiniz [super setImage:imageFileName]
. Bunun gibi bir şey:
-(void) setImage:(NSString*)fileName
{
imageFileName = fileName;
[super setImage:fileName];
}
Doğal olarak yapılamaması, mümkün olmadığı anlamına gelmez :)
if ([imageForCheckMark.image isEqual:[UIImage imageNamed:@"crossCheckMark.png"]]||[imageForCheckMark.image isEqual:[UIImage imageNamed:@"checkMark.png"]])
{
}
hot dog
ya not hotdog
.
Hayır! Bunu yerel olarak yapmanın yolu yok. UIImageView alt sınıfına girmeniz ve bir imageFileName özelliği eklemeniz gerekir (bu özelliği, görüntüyü ayarladığınızda belirleyeceksiniz).
UIImageView, UIImage yüklenen görüntünün dosya adını tutmaz.
Sen de yapabilirsin
1: (yukarıda Kenny Winker tarafından önerildiği gibi) UIImageView alt sınıfının bir fileName özelliğine sahip olması veya
2: resim dosyalarını sayılarla adlandırın (resim1.jpg, resim2.jpg vb.) Ve bu resimleri karşılık gelen numarayla etiketleyin (resim1.jpg için etiket = 1, resim2.jpg vb. İçin etiket = 2) veya
3: UIImageView görüntüsünü her güncellediğinizde güncellenen sınıf düzeyinde bir değişkene (örn. NSString * currentFileName) sahip olun
Bu kod size şu konularda yardımcı olacaktır: -
- (NSString *)getFileName:(UIImageView *)imgView{
NSString *imgName = [imgView image].accessibilityIdentifier;
NSLog(@"%@",imgName);
return imgName;
}
Bunu şu şekilde kullanın: -
NSString *currentImageName = [self getFileName:MyIImageView];
[image setAccessibilityIdentifier:@"demoFileName.png"] ;
ve sonra bu yöntemi çağırın
Veya geri yükleme tanımlayıcısını şu şekilde kullanabilirsiniz:
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"
Temel olarak bu çözümde, görüntünün adını tutmak için geri yükleme tanımlayıcısını kullanıyorsunuz, böylece daha sonra her yerde kullanabilirsiniz. Görüntüyü güncellerseniz, aşağıdaki gibi geri yükleme tanımlayıcısını da güncellemeniz gerekir:
myImageView.restorationIdentifier = "newImageName"
Umarım bu size yardımcı olur, iyi şanslar!
Evet, aşağıdaki kod gibi veriler yardımıyla karşılaştırabilirsiniz
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;
}
Görüntü adını UImageView ile ilişkilendirmek için objektif c Çalışma Zamanı özelliğini kullanabilirsiniz.
İlk ithalat #import <objc/runtime.h>
Sınıfınızda
ardından kodunuzu aşağıdaki gibi uygulayın:
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");
Umarım size yardımcı olur.
Swift 4.2 adını al
Varlıklarda bulunan düğme resim adlarını karşılaştırmak istemenin bir yolu var.
@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()
}
Hızlı 3
Önce accessibilityIdentifier'ı imageName olarak ayarlayın
myImageView.image?.accessibilityIdentifier = "add-image"
Ardından aşağıdaki kodu kullanın.
extension UIImageView
{
func getFileName() -> String? {
// First set accessibilityIdentifier of image before calling.
let imgName = self.image?.accessibilityIdentifier
return imgName
}
}
Son olarak, tanımlamak için yöntemin çağırma yolu
myImageView.getFileName()
Bu sorunu hallettim, MVC tasarım kalıbı ile çözdüm, Card sınıfını oluşturdum:
@interface Card : NSObject
@property (strong,nonatomic) UIImage* img;
@property (strong,nonatomic) NSString* url;
@end
// daha sonra UIViewController
içinde DidLoad
Do Yöntem:
// init Cards
Card* card10= [[Card alloc]init];
card10.url=@"image.jpg";
card10.img = [UIImage imageNamed:[card10 url]];
// Örneğin
UIImageView * myImageView = [[UIImageView alloc]initWithImage:card10.img];
[self.view addSubview:myImageView];
// resmin adını kontrol etmek isteyebilirsin, böylece bunu yapabilirsin:
//Örneğin
NSString * str = @"image.jpg";
if([str isEqualToString: [card10 url]]){
// your code here
}
Kod swift3'te çalışıyor - didFinishPickingMediaWithInfo temsilci yönteminin içine kod yazın:
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)
}