Xcode 11.7 + iOS 13.7ã®ç°å¢ã§TextFieldã使ã£ã¦ããã¨ãæ¥æ¬èªå ¥åæã«æåããããããªããã¨ã«æ°ãã¤ãããéçºä¸ã¯ãã¼ãã¦ã§ã¢ãã¼ãã¼ãã§è±æ°åã®ã¿å ¥åãã¦ããã®ã§æ°ãã¤ããªãã£ãã
å®è¡ç°å¢
- Xcode 11.7
- iOS 13.7
åé¡ã®æå
SwiftUIã®TextFieldã§æ¥æ¬èª(ããªãã¯å ¥åï¼)ããã¨æåããããããªã£ã¦ãã¾ãä¸å ·åãçºçããããã¨ãã°ããã ããããªãã¯å ¥åããå ´åã«ã¯ä»¥ä¸ã®ç¾è±¡ãçºçããã
- ããããå ¥åå¾
- ããããå ¥å
- ããããæ¶ãã¦ãããã®ã¿æ®ã
ããã§ã¯ã¾ã¨ããªã«åãç»é¢ãä½ããã¨ãã§ããªãã
解決編
TextFieldã§ãªãã¨ãããããã«æ¤è¨ãã¦ã¿ããã®ã®é£ããããªã®ã§è«¦ãã¦UIKitã®UITextFieldãã©ãããã¦ä½¿ããã¨ã«ãããå ¥åä¸ã®ããã¹ãã綺éºã«ãã¤ã³ãã£ã³ã°ã§ããã¨æã£ã¦ãããããªãè¦å´ããã
UITextField.textDidChangeNotification
ã®éç¥ãåãåããé½åº¦ãã¤ã³ãã£ã³ã°ããtextãæ¸ãæãããã¨ã«ããã
import SwiftUI import UIKit struct TextFieldNative: UIViewRepresentable { let hint: String @Binding var text: String @State private var textContentType: UITextContentType? = nil @State private var keyboardType: UIKeyboardType = .default var isFirstResponder: Bool = false class Coordinator: NSObject, UITextFieldDelegate { let target: TextFieldNative var didBecomeFirstResponder = false init(target: TextFieldNative) { self.target = target } func textFieldDidEndEditing(_ textField: UITextField) { target.text = textField.text ?? "" } func textFieldShouldReturn(_ textField: UITextField) -> Bool { textField.resignFirstResponder() } /// 1æåãã¤ã®å¤æ´ã§å¼ã°ãã(UITextField.textDidChangeNotification) @objc func textDidChange(_ textField: UITextField) { target.text = textField.text ?? "" } } init(_ hint: String, text: Binding<String>, contentType: UITextContentType?, keyboardType: UIKeyboardType) { self.hint = hint self._text = text self.textContentType = contentType self.keyboardType = keyboardType } func makeCoordinator() -> TextFieldNative.Coordinator { return Coordinator(target: self) } func makeUIView(context: Context) -> UITextField { let textField = UITextField(frame: .zero) textField.placeholder = hint textField.delegate = context.coordinator textField.text = text textField.textContentType = textContentType textField.keyboardType = keyboardType textField.setContentCompressionResistancePriority(.defaultLow, for: .horizontal) NotificationCenter.default.addObserver(forName: UITextField.textDidChangeNotification, object: textField, queue: nil) { (_) in context.coordinator.textDidChange(textField) } // NotificationCenter.default.addObserver(forName: UITextField.textDidBeginEditingNotification, object: textField, queue: nil) { (_) in // context.coordinator.textDidChange(textField) // } // NotificationCenter.default.addObserver(forName: UITextField.textDidEndEditingNotification, object: textField, queue: nil) { (_) in // context.coordinator.textDidChange(textField) // } return textField } static func dismantleUIView(_ uiView: UITextField, coordinator: Coordinator) { NotificationCenter.default.removeObserver(self, name: UITextField.textDidChangeNotification, object: uiView) // NotificationCenter.default.removeObserver(self, name: UITextField.textDidBeginEditingNotification, object: uiView) // NotificationCenter.default.removeObserver(self, name: UITextField.textDidEndEditingNotification, object: uiView) } func updateUIView(_ uiView: UITextField, context: Context) { if uiView.text != text { uiView.text = text } if isFirstResponder && !context.coordinator.didBecomeFirstResponder { uiView.becomeFirstResponder() context.coordinator.didBecomeFirstResponder = true } } }
ä½è«ã§ã¯ãããå
¥åãã¦ããæåæ°ãé·ããªãã¨ãViewãã®ãã®ã横ã«ä¼¸ã³ã¦ããããã«ãªã£ã¦ãã¾ã£ããSwiftUIã®Viewå´ã§æå®ããå¶ç´ããããå¼·ãããããªã®ã§ãmakeUIView(context:)
ã§ãtextField.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
ã¨ãã¦æç¤ºçã«åªå
度ããããã