কোডটি এক্সকোড, বিটা 7 এর জন্য আপডেট হয়েছে।
এটি অর্জনের জন্য আপনার প্যাডিং, স্ক্রোলভিউ বা তালিকার দরকার নেই। যদিও এই সমাধানটি তাদের সাথেও দুর্দান্ত খেলবে। আমি এখানে দুটি উদাহরণ অন্তর্ভুক্ত করছি।
প্রথমে একটিতে সমস্ত পাঠ্য ফিল্ড উপরে সরানো হয়, যদি তাদের যে কোনওটির জন্য কীবোর্ড প্রদর্শিত হয়। তবে কেবল প্রয়োজন হলে। যদি কীবোর্ড পাঠ্যক্ষেত্রগুলি গোপন না করে তবে তারা সরবে না।
দ্বিতীয় উদাহরণে, সক্রিয় পাঠ্যক্ষেত্রটি লুকানো এড়াতে কেবল ভিউটি যথেষ্ট পরিমাণে সরানো হয়।
উভয় উদাহরণই শেষে পাওয়া একই সাধারণ কোড ব্যবহার করে: জ্যামিতিজেটার এবং কীবোর্ডগার্ডিয়ান
প্রথম উদাহরণ (সমস্ত পাঠ্যক্ষেত্রগুলি দেখান)
struct ContentView: View {
@ObservedObject private var kGuardian = KeyboardGuardian(textFieldCount: 1)
@State private var name = Array<String>.init(repeating: "", count: 3)
var body: some View {
VStack {
Group {
Text("Some filler text").font(.largeTitle)
Text("Some filler text").font(.largeTitle)
}
TextField("enter text #1", text: $name[0])
.textFieldStyle(RoundedBorderTextFieldStyle())
TextField("enter text #2", text: $name[1])
.textFieldStyle(RoundedBorderTextFieldStyle())
TextField("enter text #3", text: $name[2])
.textFieldStyle(RoundedBorderTextFieldStyle())
.background(GeometryGetter(rect: $kGuardian.rects[0]))
}.offset(y: kGuardian.slide).animation(.easeInOut(duration: 1.0))
}
}
দ্বিতীয় উদাহরণ (কেবল সক্রিয় ক্ষেত্র দেখান)
struct ContentView: View {
@ObservedObject private var kGuardian = KeyboardGuardian(textFieldCount: 3)
@State private var name = Array<String>.init(repeating: "", count: 3)
var body: some View {
VStack {
Group {
Text("Some filler text").font(.largeTitle)
Text("Some filler text").font(.largeTitle)
}
TextField("text #1", text: $name[0], onEditingChanged: { if $0 { self.kGuardian.showField = 0 } })
.textFieldStyle(RoundedBorderTextFieldStyle())
.background(GeometryGetter(rect: $kGuardian.rects[0]))
TextField("text #2", text: $name[1], onEditingChanged: { if $0 { self.kGuardian.showField = 1 } })
.textFieldStyle(RoundedBorderTextFieldStyle())
.background(GeometryGetter(rect: $kGuardian.rects[1]))
TextField("text #3", text: $name[2], onEditingChanged: { if $0 { self.kGuardian.showField = 2 } })
.textFieldStyle(RoundedBorderTextFieldStyle())
.background(GeometryGetter(rect: $kGuardian.rects[2]))
}.offset(y: kGuardian.slide).animation(.easeInOut(duration: 1.0))
}.onAppear { self.kGuardian.addObserver() }
.onDisappear { self.kGuardian.removeObserver() }
}
জ্যামিতিগেটর
এটি এমন একটি দৃশ্য যা এর প্যারেন্ট ভিউয়ের আকার এবং অবস্থান শোষণ করে। এটি অর্জন করার জন্য, এটিটিকে। ব্যাকগ্রাউন্ড মডিফায়ারের অভ্যন্তরে ডাকা হয়। এটি কোনও দৃশ্যের পটভূমি সাজানোর উপায় নয়, এটি একটি খুব শক্তিশালী সংশোধক। । ব্যাকগ্রাউন্ডে (মাইভিউ ()) এ কোনও দৃশ্য পাস করার সময়, মাইভিউ প্যারেন্ট হিসাবে পরিবর্তিত ভিউ পাচ্ছে। জ্যামিতিরিডার ব্যবহার করে পিতামাতার জ্যামিতিটি দেখা সম্ভব হয়েছে।
উদাহরণস্বরূপ: Text("hello").background(GeometryGetter(rect: $bounds))
পাঠ্য দৃশ্যের আকার এবং অবস্থান এবং বৈশ্বিক স্থানাঙ্ক স্থান ব্যবহার করে ভেরিয়েবল সীমানা পূরণ করা হবে।
struct GeometryGetter: View {
@Binding var rect: CGRect
var body: some View {
GeometryReader { geometry in
Group { () -> AnyView in
DispatchQueue.main.async {
self.rect = geometry.frame(in: .global)
}
return AnyView(Color.clear)
}
}
}
}
আপডেটটি আমি ডিসপ্যাচকিউ.ইমেন.সিএনসিএনকে যুক্ত করেছিলাম, যখন দৃশ্যধারণের সময় এটি রেন্ডার হওয়ার সাথে সাথে তার অবস্থার পরিবর্তন করার সম্ভাবনা এড়ায় * ***
কীবোর্ডগার্ডিয়ান
কীবোর্ডগুয়ার্ডিয়ান এর উদ্দেশ্য হ'ল কীবোর্ড শো / লুকানো ইভেন্টগুলি ট্র্যাক রাখা এবং ভিউটি স্থানান্তরিত করার জন্য কতটা স্থান প্রয়োজন তা গণনা করা।
আপডেট: স্লাইডটি রিফ্রেশ করার জন্য আমি কীবোর্ডগার্ডিয়ানটি সংশোধন করেছি, যখন ব্যবহারকারী এক ক্ষেত্র থেকে অন্য ক্ষেত্রটিতে ট্যাব করে
import SwiftUI
import Combine
final class KeyboardGuardian: ObservableObject {
public var rects: Array<CGRect>
public var keyboardRect: CGRect = CGRect()
public var keyboardIsHidden = true
@Published var slide: CGFloat = 0
var showField: Int = 0 {
didSet {
updateSlide()
}
}
init(textFieldCount: Int) {
self.rects = Array<CGRect>(repeating: CGRect(), count: textFieldCount)
}
func addObserver() {
NotificationCenter.default.addObserver(self, selector: #selector(keyBoardWillShow(notification:)), name: UIResponder.keyboardWillShowNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(keyBoardDidHide(notification:)), name: UIResponder.keyboardDidHideNotification, object: nil)
}
func removeObserver() {
NotificationCenter.default.removeObserver(self)
}
deinit {
NotificationCenter.default.removeObserver(self)
}
@objc func keyBoardWillShow(notification: Notification) {
if keyboardIsHidden {
keyboardIsHidden = false
if let rect = notification.userInfo?["UIKeyboardFrameEndUserInfoKey"] as? CGRect {
keyboardRect = rect
updateSlide()
}
}
}
@objc func keyBoardDidHide(notification: Notification) {
keyboardIsHidden = true
updateSlide()
}
func updateSlide() {
if keyboardIsHidden {
slide = 0
} else {
let tfRect = self.rects[self.showField]
let diff = keyboardRect.minY - tfRect.maxY
if diff > 0 {
slide += diff
} else {
slide += min(diff, 0)
}
}
}
}