13的話
這期是下個一百期的開始。很巧的是,我跟 Pofat 錄製的 podcast 也前進到第六季。
絕大多數的 iOS 開發者還沒有機會好好來用 SwiftUI,但這又是我最近比較有心得的東西,所以還是跟大家聊一下這塊。
排版方式是我很喜歡 SwiftUI 的一點。寫成下面這樣,再加上確定 Preview 100% 運作(需要開發團隊共識),就會很好維護。
![Twitter avatar for @ethanhuang13](https://substackcdn.com/image/twitter_name/w_96/ethanhuang13.jpg)
還有一個小技巧。如果你想要把某個
Text
填滿畫面,可是Text
是依照文字內容來決定大小。我會寫Color.clear.overlay(Text("..."))
,因為 SwiftUI 的Color
是預設往外填滿,而.overlay
的尺寸是根據它加在什麼上面而定(.background
也是)。你甚至可以在 overlay 設定
alignment
。很適合在一張圖片上某個角落放個標籤那類的需求。最後說一個可能會顛覆你認知的東西。如果 app 有很多畫面需要疊加顯示(像 modal view 那樣),在 SwiftUI 裡我目前的作法不是用 present,而是把這些 views 都放在一個
ZStack
,然後需要顯示時去改變它們的opacity
與offset
就好了。好啦,這期的 SwiftUI 小教室就先到這裡。
🧪 iOS 15 Beta 3
這版其實是 WWDC 之後第一次打包的版本,所以才開始有 feedback 帶來的變化。
Xcode 13 Beta 3 如果你在第一時間就下載,請注意後來又推出了
13A5192j
這個 build。有些 SwiftUI API 回頭支援到 iOS 13,詳見最下面 weak self。iOS 15 Beta 3 改最多的應該是 Safari
🧪iOS 14.7 RC
🎒Apple 開學季專案(Back to School)
符合資格的話可以取得一台 AirPods。
📣確認 UIViewController 有被釋放的小技巧
這個技巧幾年前就看過了,簡單來說是在 dealloc 的時候播放提示聲。
![Twitter avatar for @sarunw](https://substackcdn.com/image/twitter_name/w_96/sarunw.jpg)
![Image](https://substackcdn.com/image/fetch/w_600,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fpbs.substack.com%2Fmedia%2FE6ikKpIXIAIYaTu.jpg)
@_sip_
Swift 中的 SPI 是 System Programming Interfaces 的意思。雖然不是正式的功能,但可以在內部 frameworks 之間開出一些 API,而外部看不到(有點類似 @testable
),頗實用的啊。原本的 PR 在此。
![Twitter avatar for @_inside](https://substackcdn.com/image/twitter_name/w_96/_inside.jpg)
![// In MyAppCore.framework
@_spi(MyInternalSPI)
public final class MyInternalSPIThing {
public func doSomethingThatShouldNotBeExposedToExternalClients() {
// ...
}
}
// In MyAppUI.framework
@_spi(MyInternalSPI)
import MyAppCore
// You may now call MyInternalSPIThing.doSomethingThatShouldNotBeExposedToExternalClients](https://substackcdn.com/image/fetch/w_600,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fpbs.substack.com%2Fmedia%2FE6b4v6BXMAULgKc.jpg)
![Twitter avatar for @dgregor79](https://substackcdn.com/image/twitter_name/w_96/dgregor79.jpg)
🤪Random Tweets
真的要趕快去試一下 Private Relay,就算 iOS app 沒問題,搞不好網站會受到影響。
![Twitter avatar for @ethanhuang13](https://substackcdn.com/image/twitter_name/w_96/ethanhuang13.jpg)
這串值得一讀。
🎙weak self podcast 79: 為什麼有些 API 可以 backport
第六季正式開始
所謂 backport 的範例
![Twitter avatar for @zntfdr](https://substackcdn.com/image/twitter_name/w_96/zntfdr.jpg)
![For example, we went from:
@available(iOS 15.0, macOS 12.0, tvOS 15.0, watchOS 8.0, *) // 👈🏻
extension Section where Parent : View, Content : View, Footer : View {
public init(
@ViewBuilder content: () -> Content,
@ViewBuilder header: () -> Parent,
@ViewBuilder footer: () -> Footer
)
}
To:
@available(iOS 13.0, macOS 10.15, tvOS 13.0, watchOS 6.0, *) // 👈🏻
extension Section where Parent : View, Content : View, Footer : View {
public init(
@ViewBuilder content: () -> Content,
@ViewBuilder header: () -> Parent,
@ViewBuilder footer: () -> Footer
)
}](https://substackcdn.com/image/fetch/w_600,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fpbs.substack.com%2Fmedia%2FE6Ucr9YUUAAvubN.jpg)
💼職缺/履歷交流區
求才職缺:
CATCHPLAY+ Senior iOS Developer
如果你有 iOS 相關職缺或是求職履歷想要刊登在開發者週報,請見關於。