如何获取 UIImage 中使用的图像名称?

问题描述 投票:0回答:6

我正在使用 UIImage,其中有一个图像,我想知道图像的名称。

iphone objective-c ios ipad uiimage
6个回答
8
投票

该功能并非内置于

UIImage
,因为图像并不总是从文件加载。但是,您可以创建自定义
UIImageView
子类来满足您的需求。


5
投票

这是不可能的。 UIImage 实例包含实际的图像数据,而不引用任何文件名。


3
投票

此代码将帮助您

    NSString *imgName = [self.imgView1st image].accessibilityIdentifier;

    NSLog(@"%@",imgName);

    [self.imgView2nd setImage:[UIImage imageNamed:imgName]];

1
投票

图像不一定来自文件或其他命名源,因此并非所有图像都有名称。当您从文件创建图像时,您可以将名称存储在单独的

NSString*
中,然后在必要时引用该存储的名称。


1
投票

这个答案(https://stackoverflow.com/a/72542728/897465)有(我相信)最好的答案:

let img = UIImage(named: "something")
img?.imageAsset?.value(forKey: "assetName")

这是一个方便的扩展:

extension UIImage {

    var containingBundle: Bundle? {
        imageAsset?.value(forKey: "containingBundle") as? Bundle
    }

    var assetName: String? {
        imageAsset?.value(forKey: "assetName") as? String
    }

}

1
投票

在更高版本的 iOS 版本中,可以从描述中提取图像名称。请注意,仅供调试使用!

extension StringProtocol {
    
    /// Range from the start to the end.
    var fullNSRange: NSRange {
        NSRange(location: 0, length: count)
    }
}

extension UIImage {
    
    /// Extracts image name from a description.
    ///
    /// * Example description 1: `<UIImage:0x600003005320 named(IMG_6312.heic) {4284, 5712} renderingMode=automatic(original)>`
    /// * Example name 1: `IMG_6312.heic`
    ///
    /// * Example description 2: `<UIImage:0x60000278ce10 named(main: ic_timeline_milestone_bluedot) {16, 16}>`
    /// * Example name 2: `ic_timeline_milestone_bluedot`
    ///
    /// - warning: For the debug use only.
    var name: String? {
        let description = self.description
        guard let regexp = try? NSRegularExpression(pattern: "\\((?:main: )?([^)]*)\\)", options: []) else { return nil }
        guard let match = regexp.matches(in: description, options: [], range: description.fullNSRange).first else { return nil }
        guard match.numberOfRanges > 0 else { return nil }
        let range = match.range(at: match.numberOfRanges - 1)
        let idx1 = description.index(description.startIndex, offsetBy: range.lowerBound)
        let idx2 = description.index(description.startIndex, offsetBy: range.upperBound)
        return String(description[idx1..<idx2])
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.