Kub*_*aun 78 objective-c uiimageview uiimage ios swift
是否可以读取UIImageView's
UIImage
目前存储在UIImageView
?的名称?
我希望你能做一些像这样的事,但还没弄明白.
NSString *currentImageName = [MyIImageView getFileName];
Run Code Online (Sandbox Code Playgroud)
小智 103
您可以对UIView的任何子类使用setAccessibilityIdentifier方法
UIImageView *image ;
[image setAccessibilityIdentifier:@"file name"] ;
NSString *file_name = [image accessibilityIdentifier] ;
Run Code Online (Sandbox Code Playgroud)
Jon*_*ing 86
不.你不能这样做.
原因是UIImageView
实例不存储图像文件.它存储显示UIImage
实例.从文件制作图像时,您可以执行以下操作:
UIImage *picture = [UIImage imageNamed:@"myFile.png"];
Run Code Online (Sandbox Code Playgroud)
完成此操作后,不再引用文件名.该UIImage
实例包含数据,无论它在何处获得.因此,UIImageView
不可能知道文件名.
此外,即使你可以,你也永远不会从视图中获取文件名信息.这打破了MVC.
Ben*_*tow 19
不,不,一般来说,这些都是可能的.它会让你觉得自己像个肮脏的人.如果绝对必须,请执行以下操作:
使用您自己的实现+imageNamed:(NSString*)imageName
调用现有实现创建一个类别,并使用此处标识的技术(如何在对象中使用objc_setAssociatedObject/objc_getAssociatedObject?)永久关联imageName
返回的UIImage对象.
使用Method SwizzlingimageNamed:
在Objective-C运行时的方法查找表中交换为您的实现提供的实现.
随时访问与UIImage实例关联的名称(使用objc_getAssociatedObject).
我可以验证这是否有效,但需要注意的是你无法获得在NIB中加载的UIImage的名称.看起来从NIB加载的图像不是通过任何标准函数调用创建的,所以对我来说这真的很神秘.
我要离开你的实施.使用Objective-C运行时的复制粘贴代码是一个非常糟糕的主意,因此请仔细考虑项目的需求,并在必要时实现此目的.
Wen*_*idd 10
没有本地方法可以做到这一点; 但是,您可以自己轻松创建此行为.
您可以子类化UIImageView
并添加新的实例变量:
NSString* imageFileName;
Run Code Online (Sandbox Code Playgroud)
然后您可以覆盖setImage
,首先设置imageFileName
为您正在设置的图像的文件名,然后调用[super setImage:imageFileName]
.像这样的东西:
-(void) setImage:(NSString*)fileName
{
imageFileName = fileName;
[super setImage:fileName];
}
Run Code Online (Sandbox Code Playgroud)
仅仅因为它本身无法完成并不意味着它是不可能的:)
iEi*_*ein 10
if ([imageForCheckMark.image isEqual:[UIImage imageNamed:@"crossCheckMark.png"]]||[imageForCheckMark.image isEqual:[UIImage imageNamed:@"checkMark.png"]])
{
}
Run Code Online (Sandbox Code Playgroud)
UIImageView和UIImage都不会保留加载的图像的文件名.
你也可以
1 :(如上面的Kenny Winker所建议的)子类UIImageView具有fileName属性或
2:使用数字(image1.jpg,image2.jpg等)命名图像文件,并用相应的数字标记这些图像(image1.jpg为tag = 1,image2.jpg等为tag = 2)或
3:有一个类级变量(例如NSString*currentFileName),每当你更新UIImageView的图像时它都会更新
简而言之:
uiImageView.image?.imageAsset?.value(forKey: "assetName")
Run Code Online (Sandbox Code Playgroud)
UIImage
有一个imageAsset
属性(自 iOS 8.0 起)引用它的UIImageAsset
创建来源(如果有)。
UIImageAsset
有一个assetName
包含您想要的信息的属性。不幸的是它不是公开的,因此需要使用value(forKey: "assetName")
. 请自行承担使用风险,因为它已正式超出 App Store 范围。
或者您可以使用恢复标识符,如下所示:
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"
Run Code Online (Sandbox Code Playgroud)
基本上,在此解决方案中,您使用恢复标识符来保存图像的名称,以便以后可以在任何地方使用它。如果更新图像,则还必须更新恢复标识符,如下所示:
myImageView.restorationIdentifier = "newImageName"
Run Code Online (Sandbox Code Playgroud)
我希望对你有帮助,祝你好运!
归档时间: |
|
查看次数: |
118624 次 |
最近记录: |