mirror of
https://github.com/divkit/divkit.git
synced 2026-06-06 20:07:59 +00:00
9b151d2a54
Новый подход с фолбеком размеров с match_parent на wrap_content constrained
58 lines
1.7 KiB
Swift
58 lines
1.7 KiB
Swift
import Foundation
|
|
|
|
import CommonCore
|
|
import LayoutKit
|
|
|
|
protocol DivImageProtocol: DivBase, DivImageContentMode {
|
|
var aspect: DivAspect? { get }
|
|
|
|
func resolvePreview(_ expressionResolver: ExpressionResolver) -> String?
|
|
func resolvePlaceholderColor(_ expressionResolver: ExpressionResolver) -> Color
|
|
}
|
|
|
|
extension DivImageProtocol {
|
|
func resolveHeight(_ context: DivBlockModelingContext) -> ImageBlockHeight {
|
|
if let aspect = aspect {
|
|
return .ratio(aspect.resolveRatio(context.expressionResolver) ?? 0)
|
|
}
|
|
return .trait(makeContentHeightTrait(with: context))
|
|
}
|
|
|
|
func resolvePlaceholder(_ expressionResolver: ExpressionResolver) -> ImagePlaceholder {
|
|
if
|
|
let base64 = resolvePreview(expressionResolver),
|
|
let data = Data(base64Encoded: base64),
|
|
let image = Image(data: data) {
|
|
return .image(image)
|
|
} else {
|
|
return .color(resolvePlaceholderColor(expressionResolver))
|
|
}
|
|
}
|
|
|
|
func checkLayoutTraits(context: DivBlockModelingContext) throws {
|
|
let expressionResolver = context.expressionResolver
|
|
guard width.makeLayoutTrait(with: expressionResolver) != .intrinsic else {
|
|
throw DivBlockModelingError(
|
|
"\(typeName) has wrap_content width",
|
|
path: context.parentPath
|
|
)
|
|
}
|
|
|
|
guard
|
|
height.makeLayoutTrait(with: expressionResolver) != .intrinsic || aspect != nil
|
|
else {
|
|
throw DivBlockModelingError(
|
|
"\(typeName) without aspect has wrap_content height",
|
|
path: context.parentPath
|
|
)
|
|
}
|
|
}
|
|
|
|
private var typeName: String {
|
|
guard let typeName = String(describing: self).split(separator: ".").last else {
|
|
return "DivImage"
|
|
}
|
|
return String(typeName)
|
|
}
|
|
}
|