TabView 中的奇怪图像行为:图像无法缩放
Strange Image Behavior In TabView: Image Fails To Scale
这是一个很有意思的问题。基本上,我试图缩小图像;它在普通视图中工作,但在 tabview 中不起作用,这很烦人。我尝试了多种缩放图像的方法(.frame、.scaleToFit、GeometryReader 等),但基本上图像只是拒绝缩放。为简单起见,我将在示例中仅使用 .frame。
TabView() {
StatsUI()
.tabItem {
Text("Report")
Image("Stats")
.resizable()
.frame(width : 50, height : 50)
}
作为参考,这里是缩放图像的代码。
struct StatsUI : View {
var body : some View {
HStack {
Spacer()
Text("Stats")
Image("Stats")
.resizable()
.frame(width : 50, height : 50)
Spacer()
}
}
}
如果看起来差不多,那是因为它确实如此。
这是它的样子。
tabview 中的图像不会缩放。很奇怪。
感谢任何有想法的人!
A tabItem
采用 Text
和 Image
,并且应用修饰符似乎不起作用,因此您需要提供一个原生缩放到右侧的图像尺寸。
我拼凑了这个 SwiftUI 视图,它将创建一个 Image
并按您指定的大小绘制。
你这样使用它:
ScaledImage(name: "Stats", size: CGSize(width: 24, height: 24))
struct ScaledImage: View {
let name: String
let size: CGSize
var body: Image {
let uiImage = resizedImage(named: self.name, for: self.size) ?? UIImage()
return Image(uiImage: uiImage.withRenderingMode(.alwaysOriginal))
}
func resizedImage(named: String, for size: CGSize) -> UIImage? {
guard let image = UIImage(named: named) else {
return nil
}
let renderer = UIGraphicsImageRenderer(size: size)
return renderer.image { (context) in
image.draw(in: CGRect(origin: .zero, size: size))
}
}
}
演示
这是在 tabView 和 tabItem 中使用相同图像的演示:
struct ContentView: View {
var body: some View {
TabView() {
ZStack {
Color.yellow
Image("Stats")
.resizable()
.frame(width: 200, height: 200)
}
.tabItem {
ScaledImage(name: "Stats", size: CGSize(width: 26, height: 26))
Text("Stats")
}
}
}
}
注意:我从 NSHipster.com
的这篇博客文章开始
这是一个很有意思的问题。基本上,我试图缩小图像;它在普通视图中工作,但在 tabview 中不起作用,这很烦人。我尝试了多种缩放图像的方法(.frame、.scaleToFit、GeometryReader 等),但基本上图像只是拒绝缩放。为简单起见,我将在示例中仅使用 .frame。
TabView() {
StatsUI()
.tabItem {
Text("Report")
Image("Stats")
.resizable()
.frame(width : 50, height : 50)
}
作为参考,这里是缩放图像的代码。
struct StatsUI : View {
var body : some View {
HStack {
Spacer()
Text("Stats")
Image("Stats")
.resizable()
.frame(width : 50, height : 50)
Spacer()
}
}
}
如果看起来差不多,那是因为它确实如此。
这是它的样子。
tabview 中的图像不会缩放。很奇怪。
感谢任何有想法的人!
A tabItem
采用 Text
和 Image
,并且应用修饰符似乎不起作用,因此您需要提供一个原生缩放到右侧的图像尺寸。
我拼凑了这个 SwiftUI 视图,它将创建一个 Image
并按您指定的大小绘制。
你这样使用它:
ScaledImage(name: "Stats", size: CGSize(width: 24, height: 24))
struct ScaledImage: View {
let name: String
let size: CGSize
var body: Image {
let uiImage = resizedImage(named: self.name, for: self.size) ?? UIImage()
return Image(uiImage: uiImage.withRenderingMode(.alwaysOriginal))
}
func resizedImage(named: String, for size: CGSize) -> UIImage? {
guard let image = UIImage(named: named) else {
return nil
}
let renderer = UIGraphicsImageRenderer(size: size)
return renderer.image { (context) in
image.draw(in: CGRect(origin: .zero, size: size))
}
}
}
演示
这是在 tabView 和 tabItem 中使用相同图像的演示:
struct ContentView: View {
var body: some View {
TabView() {
ZStack {
Color.yellow
Image("Stats")
.resizable()
.frame(width: 200, height: 200)
}
.tabItem {
ScaledImage(name: "Stats", size: CGSize(width: 26, height: 26))
Text("Stats")
}
}
}
}
注意:我从 NSHipster.com
的这篇博客文章开始