是否可以读取UIImageView's
UIImage
当前存储在中的的名称UIImageView
?
我希望您可以做这样的事情,但是还没有弄清楚。
NSString *currentImageName = [MyIImageView getFileName];
是否可以读取UIImageView's
UIImage
当前存储在中的的名称UIImageView
?
我希望您可以做这样的事情,但是还没有弄清楚。
NSString *currentImageName = [MyIImageView getFileName];
Answers:
不。你不能那样做。
原因是UIImageView
实例不存储图像文件。它存储一个显示UIImage
实例。从文件制作图像时,您将执行以下操作:
UIImage *picture = [UIImage imageNamed:@"myFile.png"];
完成此操作后,将不再引用文件名。该UIImage
实例包含的数据,无论它得到了它。因此,UIImageView
可能无法知道文件名。
另外,即使可以,也永远不会从视图中获取文件名信息。这打破了MVC。
您可以将setAccessibilityIdentifier方法用于UIView的任何子类
UIImageView *image ;
[image setAccessibilityIdentifier:@"file name"] ;
NSString *file_name = [image accessibilityIdentifier] ;
localize
简单地遍历图像并对图像名称进行一些正则表达式的方法(我有很好的理由来制作这些图像图像的实际图像而不是创建一个定制的UIImage).. ..我想知道是否有本地化在Objective-C图像的更好更清洁的方式,因为每个人都在谈论MVC,什么不可以
accessibilityDescription
不不不…一般来说,这些事情都是可能的。它只会使您感到自己像个肮脏的人。如果绝对必要,请执行以下操作:
使用您自己的实现创建一个类,该类+imageNamed:(NSString*)imageName
将调用现有实现,并使用此处标识的技术(如何在对象内部使用objc_setAssociatedObject / objc_getAssociatedObject?)imageName
与返回的UIImage对象永久关联。
使用Method SwizzlingimageNamed:
在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属性(在设置图像时设置)。
UIImageView和UIImage都不保留所加载图像的文件名。
你可以
1 :(如上面的Kenny Winker所建议)子类UIImageView具有fileName属性或
2:用数字(image1.jpg,image2.jpg等)命名图像文件,并用相应的数字标记这些图像(image1.jpg的标签= 1,image2.jpg的标签= 2等)或
3:具有一个类级别变量(例如NSString * currentFileName),该变量在您每次更新UIImageView的图像时都会更新
此代码将帮助您:-
- (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;
}
您可以使用目标c运行时功能将图像名称与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");
希望对您有帮助。
获取图像名称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()
}
迅捷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)
}