// // UITool.swift // SwiftUI_Jike // // Created by alexyang on 2019/6/5. // Copyright © 2019 alexyang. All rights reserved. // import UIKit import SwiftUI let zoneData: [ZoneModel] = load("zoneData.json") let zonnData: [ZoneModel] = getZoneModel() func getZoneModel() -> [ZoneModel] { let model = ZoneModel(id: 1000, name: "发现圈子", imageName: "faxian", category: "233") let model0 = ZoneModel(id: 1001, name: "苹果产品爱好者", imageName: "aihao", category: "233") let model1 = ZoneModel(id: 1002, name: "喵星人的日常", imageName: "miao", category: "233") let model2 = ZoneModel(id: 1003, name: "沙雕动物世界", imageName: "shadiao", category: "233") let model3 = ZoneModel(id: 1004, name: "科技圈大小事", imageName: "keji", category: "233") let model4 = ZoneModel(id: 1004, name: "今日份摄影", imageName: "sheying", category: "233") let model5 = ZoneModel(id: 1004, name: "一起拍建筑", imageName: "jianzhu", category: "233") var models = [ZoneModel]() models.append(model) models.append(model0) models.append(model1) models.append(model2) models.append(model3) models.append(model4) models.append(model5) return models } func load(_ filename: String, as type: T.Type = T.self) -> T { let data: Data guard let file = Bundle.main.url(forResource: filename, withExtension: nil) else { fatalError("Couldn't find \(filename) in main bundle.") } do { data = try Data(contentsOf: file) } catch { fatalError("Couldn't load \(filename) from main bundle:\n\(error)") } do { let decoder = JSONDecoder() return try decoder.decode(T.self, from: data) } catch { fatalError("Couldn't parse \(filename) as \(T.self):\n\(error)") } } final class ImageStore { fileprivate typealias _ImageDictionary = [String: [Int: CGImage]] fileprivate var images: _ImageDictionary = [:] fileprivate static var originalSize = 250 fileprivate static var scale = 2 static var shared = ImageStore() func image(name: String, size: Int) -> Image { let index = _guaranteeInitialImage(name: name) let sizedImage = images.values[index][size] ?? _sizeImage(images.values[index][ImageStore.originalSize]!, to: size * ImageStore.scale) images.values[index][size] = sizedImage return Image(sizedImage, scale: Length(ImageStore.scale), label: Text(verbatim: name)) } fileprivate func _guaranteeInitialImage(name: String) -> _ImageDictionary.Index { if let index = images.index(forKey: name) { return index } guard let url = Bundle.main.url(forResource: name, withExtension: "jpg"), let imageSource = CGImageSourceCreateWithURL(url as NSURL, nil), let image = CGImageSourceCreateImageAtIndex(imageSource, 0, nil) else { fatalError("Couldn't load image \(name).jpg from main bundle.") } images[name] = [ImageStore.originalSize: image] return images.index(forKey: name)! } fileprivate func _sizeImage(_ image: CGImage, to size: Int) -> CGImage { guard let colorSpace = image.colorSpace, let context = CGContext( data: nil, width: size, height: size, bitsPerComponent: image.bitsPerComponent, bytesPerRow: image.bytesPerRow, space: colorSpace, bitmapInfo: image.bitmapInfo.rawValue) else { fatalError("Couldn't create graphics context.") } context.interpolationQuality = .high context.draw(image, in: CGRect(x: 0, y: 0, width: size, height: size)) if let sizedImage = context.makeImage() { return sizedImage } else { fatalError("Couldn't resize image.") } } }