我想在應用了rotationEffect(_:anchor:)
修飾符的 SF Symbol 上使用字串插值。是否有可能做到這一點?
如果沒有修飾符,這種型別的字串插值可以正常作業(在 Swift 5.0 中):
struct ContentView: View {
var body: some View {
Text("Some text before \(Image(systemName: "waveform.circle")) plus some text after.")
}
}
但是像這樣應用修飾符:
struct ContentView: View {
var body: some View {
Text("Some text before \(Image(systemName: "waveform.circle").rotationEffect(.radians(.pi * 0.5))) plus some text after.")
}
}
不編譯并給出此錯誤:
實體方法“appendInterpolation”要求“某些視圖”符合“_FormatSpecifiable”
uj5u.com熱心網友回復:
文本插值需要一個Image
. 應用時.rotationEffect...
,它變為View
,這是無效的。
因此,另一種方法是在 SF 中使用之前旋轉 SF Image
。這就是我最終嘗試的方法,使用來自以下答案之一的代碼:Rotating UIImage in Swift
to rotate a UIImage
and using that in the Image
.
這有點令人費解,您可能需要調整錨點/位置。也許有人會想出更好的解決方案。在那之前,它似乎對我有用。
struct ContentView: View {
var body: some View {
Text("Some text before \(img) plus some text after.")
}
var img: Image {
if let uimg = UIImage(systemName: "waveform.circle"),
let rotImage = uimg.rotate(radians: .pi/4) {
return Image(uiImage: rotImage)
} else {
return Image(systemName: "waveform.circle")
}
}
}
// from: https://stackoverflow.com/questions/27092354/rotating-uiimage-in-swift
extension UIImage {
func rotate(radians: Float) -> UIImage? {
var newSize = CGRect(origin: CGPoint.zero, size: self.size).applying(CGAffineTransform(rotationAngle: CGFloat(radians))).size
// Trim off the extremely small float value to prevent core graphics from rounding it up
newSize.width = floor(newSize.width)
newSize.height = floor(newSize.height)
UIGraphicsBeginImageContextWithOptions(newSize, false, self.scale)
let context = UIGraphicsGetCurrentContext()!
// Move origin to middle
context.translateBy(x: newSize.width/2, y: newSize.height/2)
// Rotate around middle
context.rotate(by: CGFloat(radians))
// Draw the image at its center
self.draw(in: CGRect(x: -self.size.width/2, y: -self.size.height/2, width: self.size.width, height: self.size.height))
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage
}
}
uj5u.com熱心網友回復:
正如workingdog_support_Ukraine所指出的,字串插值可以使用,但修飾符會改變它們所應用的型別。所以我們需要在不擦除型別的情況下旋轉影像。Image
Image
對于簡單orientation
的旋轉,我們可以像這樣創建我們的旋轉Image
型別:
extension Image {
init(systemName: String, orientation: UIImage.Orientation) {
guard
let uiImage = UIImage(systemName: systemName),
let cgImage = uiImage.cgImage
else {
self.init(systemName: systemName)
return
}
self.init(uiImage: UIImage(cgImage: cgImage, scale: uiImage.scale, orientation: orientation))
}
}
然后我們在字串插值中使用旋轉的影像(在本例中,順時針旋轉 90 度),如下所示:
struct ContentView: View {
var body: some View {
Text("Some text before \(Image(systemName: "waveform.circle", orientation: .right)) plus some text after.")
}
}
這會在文本基線上對齊旋轉的影像。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/526037.html