現在UIImage
に格納されているUIImageView's
UIImageView
の名前を読み取ることはできますか?
私はあなたがこのような何かをすることができることを望んでいましたが、それを理解していませんでした。
NSString *currentImageName = [MyIImageView getFileName];
いや。それはできません。
理由は、UIImageView
インスタンスは画像ファイルを保存しないからです。 UIImage
インスタンスを表示します。ファイルから画像を作成するとき、次のようなことを行います。
UIImage *picture = [UIImage imageNamed:@"myFile.png"];
これが完了すると、ファイル名への参照はなくなります。 UIImage
インスタンスには、データの取得場所に関係なくデータが含まれます。したがって、UIImageView
はおそらくファイル名を知ることができませんでした。
また、できたとしても、ビューからファイル名情報を取得することはありません。それはMVCを壊します。
uIViewの任意のサブクラスに対してsetAccessibilityIdentifierメソッドを使用できます
UIImageView *image ;
[image setAccessibilityIdentifier:@"file name"] ;
NSString *file_name = [image accessibilityIdentifier] ;
いやいやいや...一般にこれらのことは可能です。それはただあなたを汚い人のように感じさせます。どうしても必要な場合は、次のようにします。
+imageNamed:(NSString*)imageName
の独自の実装でカテゴリを作成し、既存の実装を呼び出し、ここで特定された手法を使用します( オブジェクト内でobjc_setAssociatedObject/objc_getAssociatedObjectを使用するにはどうすればよいですか? )返されるUIImageオブジェクトにimageName
を関連付けます。
Method Swizzling を使用して、Objective-Cランタイムのメソッドルックアップテーブルで実装用に提供されたimageNamed:
の実装を交換します。
UIImageインスタンスに関連付けた名前(objc_getAssociatedObjectを使用)にいつでもアクセスできます。
NIBにロードされたUIImageの名前を取得できないという注意を払って、これが機能することを確認できます。 NIBからロードされた画像は、標準の関数呼び出しによって作成されたものではないようです。そのため、私には本当に謎です。
私はあなたに実装を任せています。 Objective-Cランタイムにねじ込むコードをコピーして貼り付けるのは非常に悪い考えなので、プロジェクトのニーズを慎重に検討し、必要な場合にのみこれを実装してください。
これを行うネイティブな方法はありません。ただし、この動作を自分で簡単に作成できます。
UIImageView
をサブクラス化し、新しいインスタンス変数を追加できます。
NSString* imageFileName;
次に、setImage
をオーバーライドし、最初にimageFileName
を設定する画像のファイル名に設定してから、[super setImage:imageFileName]
。このようなもの:
-(void) setImage:(NSString*)fileName
{
imageFileName = fileName;
[super setImage:fileName];
}
ネイティブに実行できないからといって、それが不可能というわけではありません:)
if ([imageForCheckMark.image isEqual:[UIImage imageNamed:@"crossCheckMark.png"]]||[imageForCheckMark.image isEqual:[UIImage imageNamed:@"checkMark.png"]])
{
}
いや。それをネイティブに行う方法はありません。 UIImageViewをサブクラス化し、imageFileNameプロパティ(画像の設定時に設定)を追加する必要があります。
読み込まれた画像のファイル名は、UIImageではなくUIImageViewでも保持されません。
あなたはどちらか
1:(上記のKenny Winkerが示唆したように)UIImageViewをサブクラス化してfileNameプロパティを設定するか、
2:画像ファイルに番号(image1.jpg、image2.jpgなど)で名前を付け、それらの画像に対応する番号(image1.jpgの場合はtag = 1、image2.jpgの場合はtag = 2)でタグ付けします。
3:UIImageViewの画像を更新するたびに更新されるクラスレベル変数(NSString * currentFileNameなど)
このコードはあなたを助けます:-
- (NSString *)getFileName:(UIImageView *)imgView{
NSString *imgName = [imgView image].accessibilityIdentifier;
NSLog(@"%@",imgName);
return imgName;
}
これを次のように使用します-
NSString *currentImageName = [self getFileName:MyIImageView];
はい、以下のコードのようなデータの助けを借りて比較できます
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;
}
または、次のように復元識別子を使用できます。
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"
基本的にこのソリューションでは、復元識別子を使用してイメージの名前を保持しているため、後でどこでも使用できます。イメージを更新する場合は、次のように復元識別子も更新する必要があります。
myImageView.restorationIdentifier = "newImageName"
それがお役に立てば幸いです!
Objectname Cランタイム機能を使用して、imagenameをUImageViewに関連付けることができます。
最初に#import <objc/runtime.h>
をクラスにインポートします
次に、以下のようにコードを実装します。
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");
お役に立てば幸いです。
スイフト3
最初にaccessibilityIdentifierをimageNameとして設定します
myImageView.image?.accessibilityIdentifier = "add-image"
次に、次のコードを使用します。
extension UIImageView
{
func getFileName() -> String? {
// First set accessibilityIdentifier of image before calling.
let imgName = self.image?.accessibilityIdentifier
return imgName
}
}
最後に、メソッドの呼び出し方法を識別します
myImageView.getFileName()
イメージ名の取得Swift 4.2
アセットにあるボタンの画像名を比較したい場合、方法があります。
@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()
}
私はこの問題に対処し、MVCデザインパターンで解決し、Cardクラスを作成しました。
@interface Card : NSObject
@property (strong,nonatomic) UIImage* img;
@property (strong,nonatomic) NSString* url;
@end
//次にUIViewController
のDidLoad
メソッドで実行する:
// init Cards
Card* card10= [[Card alloc]init];
card10.url=@"image.jpg";
card10.img = [UIImage imageNamed:[card10 url]];
//の例
UIImageView * myImageView = [[UIImageView alloc]initWithImage:card10.img];
[self.view addSubview:myImageView];
//画像名を確認したいので、これを行うことができます:
//たとえば
NSString * str = @"image.jpg";
if([str isEqualToString: [card10 url]]){
// your code here
}