UIImageView's
UIImage
現在に保存されているの名前を読み取ることは可能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] ;
localize
は単に画像を調べて画像名にいくつかのregexを行うメソッドを作成したいと思います(私はそれらを作る非常に正当な理由がありますカスタムメイドのUIImageを作成するのではなく、実際の画像を画像化します。..Objective-c ..で画像をローカライズするためのよりクリーンな方法があるかどうか疑問に思いました。誰もがMVCについて話しているので、そうではありません
accessibilityDescription
いいえいいえいいえ…一般的にこれらのことは可能です。それはあなたを汚い人のように感じさせるでしょう。どうしても必要な場合は、次のようにします。
+imageNamed:(NSString*)imageName
既存の実装を呼び出す独自の実装でカテゴリを作成し、ここで特定された手法(オブジェクト内でobjc_setAssociatedObject / objc_getAssociatedObjectを使用するにはどうすればよいですか?)を使用imageName
して、返されるUIImageオブジェクトに永続的に関連付けます。
メソッドスウィズリングを使用してimageNamed:
、Objective-Cランタイムのメソッドルックアップテーブルで提供されている実装を実装と交換します。
UIImageインスタンスに関連付けた名前に(objc_getAssociatedObjectを使用して)いつでもアクセスできます。
これが機能することを確認できますが、NIBにロードされたUIImageの名前を取得できないという警告があります。NIBから読み込まれた画像は、標準の関数呼び出しでは作成されていないようです。そのため、私には本当に謎です。
実装はあなたに任せます。Objective-Cランタイムにねじ込まれるコードをコピーして貼り付けるのは非常に悪い考えなので、プロジェクトのニーズを慎重に検討し、必要な場合にのみこれを実装してください。
UIImage
メソッドをオーバーライドするためにのサブクラスを作成してみませんか?
+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 }
これを行うネイティブな方法はありません。ただし、この動作は自分で簡単に作成できます。
サブクラス化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"]])
{
}
hot dog
かnot hotdog
。かを教えてくれるようなものです。
いいえ。それをネイティブに行う方法はありません。UIImageViewをサブクラス化し、imageFileNameプロパティ(画像を設定するときに設定する)を追加する必要があります。
UIImageもUIImageも、ロードされた画像のファイル名を保持しません。
あなたはどちらかをすることができます
1 :(上記のKennyWinkerが提案したように)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];
[image setAccessibilityIdentifier:@"demoFileName.png"] ;
から、このメソッドを呼び出します
または、次のように復元識別子を使用できます。
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"
それがお役に立てば幸いです。
はい、以下のコードのようなデータの助けを借りて比較することができます
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;
}
imagenameをUImageViewに関連付けるために、Objectivecランタイム機能を使用できます。
最初のインポート #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");
それがあなたを助けることを願っています。
画像名を取得するSwift4.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()
}
スウィフト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()
私はこの問題に対処し、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
}
コードはswift3で動作します-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)
}