本記事は以下記事の内容を参考にしています。
開発環境
# Xcode > xcodebuild -version Xcode 13.1 Build version 13A1030d # lldb (lldb) version lldb-1300.0.32.4 Swift version 5.5.1-dev
はじめに
(as TextEditor is actually UITextView) https://stackoverflow.com/questions/64591082/add-horizontal-padding-to-texteditor-but-prevent-it-from-shifting-scrollbar-insi
以前書いた記事で参考にしたStack Overflowの一節について、言及されている公式のソースがどこにも見当たらなかった。
社内で聞いたところ下記記事を共有してもらったので読む。
結論
import SwiftUI struct ContentView: View { @State private var text: String = "" var body: some View { TextEditor(text: $text) .frame(width: 250, height: 250) } } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } }
↓
(lldb) expr -l objc++ -O -- [[UIWindow keyWindow] recursiveDescription] <UIWindow: 0x7fb30f707c70; frame = (0 0; 428 926); gestureRecognizers = <NSArray: 0x600002b5c0c0>; layer = <UIWindowLayer: 0x600002b23f00>> | <UITransitionView: 0x7fb2ff706590; frame = (0 0; 428 926); autoresize = W+H; layer = <CALayer: 0x600002514fc0>> | | <UIDropShadowView: 0x7fb2ff706f00; frame = (0 0; 428 926); autoresize = W+H; layer = <CALayer: 0x6000025151a0>> | | | <_TtGC7SwiftUI14_UIHostingViewGVS_15ModifiedContentVS_7AnyViewVS_12RootModifier__: 0x7fb318008e60; frame = (0 0; 428 926); autoresize = W+H; gestureRecognizers = <NSArray: 0x600002b221c0>; layer = <CALayer: 0x60000251bf20>> | | | | <_TtGC7SwiftUI16PlatformViewHostGVS_P10$1188f044832PlatformViewRepresentableAdaptorVS_15UIKitTextEditor__: 0x7fb31800cb80; frame = (89 344.667; 250 250); anchorPoint = (0, 0); tintColor = UIExtendedSRGBColorSpace 0 0.478431 1 1; layer = <CALayer: 0x600002578cc0>> | | | | | <UITextView: 0x7fb2ff81b000; frame = (0 0; 250 250); clipsToBounds = YES; gestureRecognizers = <NSArray: 0x600002b45aa0>; layer = <CALayer: 0x600002515c00>; contentOffset: {0, 0}; contentSize: {250, 38}; adjustedContentInset: {0, 0, 0, 0}>
最下部にframeの値が一致しているUITextViewがあることが分かる。
おそらくTextEditorは内部的にUITextViewを使っているだろう、ということが分かった。(公式からの発表はないので断定はできない)
lldb
(lldb) expr -l objc++ -O -- [[UIWindow keyWindow] recursiveDescription]
lldbについて見ていく。
poぐらいしか普段使わないので現状全く分かってない。
expr
式の評価を行う。 expr, expression どちらも同じ実行結果を得られた。
(lldb) help # 省略 expression -- Evaluate an expression on the current thread. Displays any returned value with LLDB's default formatting.
(lldb) expr int $hoge = 5 (lldb) po $hoge 5
expr -l objc++
言語objc++を利用することをデバッガーに指示する。
-l
:--script-language
のエイリアス--script-language <language>
: ユーザー定義のスクリプトに指定されたスクリプト言語を使用するようにデバッガーに指示
(lldb) help <source-language> <source-language> -- One of the following languages: c89 c ada83 c++ cobol74 # 省略
利用できる言語結構あった。
-O
-O
:–one-line-before-file
のエイリアス--one-line-before-file <command>
: コマンドラインで提供されたファイルがロードされる前に、この1行のlldbコマンドを実行するようにデバッガーに指示
よく分からなかった。宿題。
-- (ハイフン2つ)
オプションの終了位置。
同じ結果が得られたコマンド
po [[UIWindow keyWindow] recursiveDescription]
Xcodeで利用するlldbコマンドは暗黙的にObjective-CとSwiftが指定されているっぽい。(嘘かも)