Bu konu çözüldü olarak işaretlenmiştir. Çözülmediğini düşünüyorsanız konuyu rapor edebilirsiniz.

ArdaReis_00

Uzman
Katılım
13 Temmuz 2024
Mesajlar
46
Çözümler
1
Beğeniler
14
Merhaba, Xcode 15.4 ve swiftuı ile Apple Watch için bir klavye uygulaması geliştiriyorum. Ancak tuşların ekranda düzgün şekilde ortalanmadığı bir durumla karşılaştım. Bu konuda çözüm arayan veya benzer bir durumla karşılaşan var mı? Görüşlerinizi paylaşabilirsiniz.

Swift:
//
//  ContentView.swift
//  iWatchKeyboard Watch App
//
//  Created by Arda Danahaliloglu on 31.08.2024.
//

import SwiftUI

struct ContentView: View {
    let letters = [
        ["Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P"],
        ["A", "S", "D", "F", "G", "H", "J", "K", "L", "Ş"],
        ["Z", "X", "C", "V", "B", "N", "M", "Ö", "Ç"]
    ]
   
    let numbersAndSymbols = [
        ["1", "2", "3", "4", "5", "6", "7", "8", "9", "0"],
        ["-", "/", ":", ";", "(", ")", "$", "&", "@", "\""],
        [".", ",", "?", "!", "'", " "]
    ]
   
    @State private var inputText = ""
    @State private var showingLetters = true
    @State private var isShiftPressed = false
    @State private var isCapsLockOn = false
    @State private var shiftClickCount = 0
   
    var body: some View {
        GeometryReader { geometry in
            VStack(spacing: 8) {
                // İlk Satır
                HStack(spacing: 4) {
                    ForEach(showingLetters ? letters[0] : numbersAndSymbols[0], id: \.self) { letter in
                        Button(action: {
                            inputText += formattedLetter(letter)
                            if isShiftPressed && !isCapsLockOn {
                                isShiftPressed = false
                            }
                        }) {
                            Text(formattedLetter(letter))
                                .frame(width: geometry.size.width / 12, height: geometry.size.width / 12)
                                .background(Color.gray)
                                .foregroundColor(.white)
                                .cornerRadius(4)
                        }
                        .buttonStyle(PlainButtonStyle())
                    }
                }
                .frame(maxWidth: .infinity, alignment: .center) // HStack hizalama

                // İkinci Satır
                HStack(spacing: 4) {
                    Spacer(minLength: geometry.size.width / 24) // Kenardan biraz boşluk
                    ForEach(showingLetters ? letters[1] : numbersAndSymbols[1], id: \.self) { letter in
                        Button(action: {
                            inputText += formattedLetter(letter)
                            if isShiftPressed && !isCapsLockOn {
                                isShiftPressed = false
                            }
                        }) {
                            Text(formattedLetter(letter))
                                .frame(width: geometry.size.width / 12, height: geometry.size.width / 12)
                                .background(Color.gray)
                                .foregroundColor(.white)
                                .cornerRadius(4)
                        }
                        .buttonStyle(PlainButtonStyle())
                    }
                    Spacer(minLength: geometry.size.width / 24)
                }
                .frame(maxWidth: .infinity, alignment: .center)

                // Üçüncü Satır
                HStack(spacing: 4) {
                    // Sol Shift tuşu
                    Button(action: {
                        shiftClickCount += 1
                        if shiftClickCount == 1 {
                            isShiftPressed = true
                        } else if shiftClickCount == 2 {
                            isCapsLockOn.toggle()
                            isShiftPressed = isCapsLockOn
                            shiftClickCount = 0
                        }
                    }) {
                        Text("⇧")
                            .frame(width: geometry.size.width / 12, height: geometry.size.width / 12)
                            .background(isCapsLockOn || isShiftPressed ? Color.blue : Color.gray)
                            .foregroundColor(.white)
                            .cornerRadius(4)
                    }
                    .buttonStyle(PlainButtonStyle())

                    Spacer(minLength: geometry.size.width / 36) // Daha küçük kenar boşluğu
                   
                    ForEach(showingLetters ? letters[2] : numbersAndSymbols[2], id: \.self) { letter in
                        Button(action: {
                            inputText += formattedLetter(letter)
                            if isShiftPressed && !isCapsLockOn {
                                isShiftPressed = false
                            }
                        }) {
                            Text(formattedLetter(letter))
                                .frame(width: geometry.size.width / 12, height: geometry.size.width / 12)
                                .background(Color.gray)
                                .foregroundColor(.white)
                                .cornerRadius(4)
                        }
                        .buttonStyle(PlainButtonStyle())
                    }
                   
                    Spacer(minLength: geometry.size.width / 36)

                    // Sağ Shift tuşu
                    Button(action: {
                        shiftClickCount += 1
                        if shiftClickCount == 1 {
                            isShiftPressed = true
                        } else if shiftClickCount == 2 {
                            isCapsLockOn.toggle()
                            isShiftPressed = isCapsLockOn
                            shiftClickCount = 0
                        }
                    }) {
                        Text("⇧")
                            .frame(width: geometry.size.width / 12, height: geometry.size.width / 12)
                            .background(isCapsLockOn || isShiftPressed ? Color.blue : Color.gray)
                            .foregroundColor(.white)
                            .cornerRadius(4)
                    }
                    .buttonStyle(PlainButtonStyle())
                }
                .frame(maxWidth: .infinity, alignment: .center)

                // Dördüncü Satır (Space Tuşu)
                HStack {
                    Spacer()
                    Button(action: {
                        inputText += " " // Boşluk ekle
                    }) {
                        Text("Space")
                            .frame(width: geometry.size.width / 2.2, height: geometry.size.width / 12)
                            .background(Color.gray)
                            .foregroundColor(.white)
                            .cornerRadius(4)
                    }
                    .buttonStyle(PlainButtonStyle())
                    Spacer()
                }
                .frame(maxWidth: .infinity, alignment: .center)
            }
            .padding(.horizontal, 2) // Dış çerçevede biraz padding
        }
    }
   
    func formattedLetter(_ letter: String) -> String {
        if isCapsLockOn || isShiftPressed {
            return letter.uppercased()
        } else {
            return letter.lowercased()
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
            .previewDevice("Apple Watch Series 9 - 45mm")
    }
}
 

Dosya Ekleri

  • Ekran Resmi 2024-09-03 22.31.01.webp
    Ekran Resmi 2024-09-03 22.31.01.webp
    159,2 KB · Görüntüleme: 95
Çözüm
Bilmediğim bir dil olmadığı için çok yorum yapamayacağım ama bana ortalanma işlevi doğru çalışıyor gibi geldi. Sıkıntının ortalanmadan ziyade taşma (overflow) olduğunu düşünüyorum yani satır genişliği, ekran genişliğinden fazla olduğu için böyle bir görüntü oluşuyor. Özellikle 3. satır çok geniş duruyor ve diğer satırların konumunu da etkiliyor bu satır. Diğer satırların sollarındaki boşluklar, ortalanmadan kaynaklı olmalı.

width: geometry.size.width / 12 — Burada yaptığınız şey iyi gözüküyor ama HStack(spacing: 4) kısmı da işin içine girince satır taşıyor olabilir. Bunu, 3. satırdan bağımsız söylüyorum yani sanki 3. satırın genişliğini azaltsanız bile diğer satırlar bu durumdan ötürü taşmaya devam edecek.

Yerinizde olsam width: geometry.size.width / 12 kısmındaki 12'yi azaltmayı deneyebilirdim.

Ayrıca:

Swift:
Spacer(minLength: geometry.size.width / 36) // Daha küçük kenar boşluğu

Tahminimce buradaki elementin iki yanında da HStack(spacing: 4) kısmından dolayı 4'er birimlik boşluklar oluşuyor. Çıktıdan yola çıkarak söylüyorum. İstediğiniz şey bu değil sanki, yazdığınız yoruma bakarsak.



@ArdaReis_00, nasıl bir çözüm buldunuz? Çıktıyı da merak ettim.
Bilmediğim bir dil olmadığı için çok yorum yapamayacağım ama bana ortalanma işlevi doğru çalışıyor gibi geldi. Sıkıntının ortalanmadan ziyade taşma (overflow) olduğunu düşünüyorum yani satır genişliği, ekran genişliğinden fazla olduğu için böyle bir görüntü oluşuyor. Özellikle 3. satır çok geniş duruyor ve diğer satırların konumunu da etkiliyor bu satır. Diğer satırların sollarındaki boşluklar, ortalanmadan kaynaklı olmalı.

width: geometry.size.width / 12 — Burada yaptığınız şey iyi gözüküyor ama HStack(spacing: 4) kısmı da işin içine girince satır taşıyor olabilir. Bunu, 3. satırdan bağımsız söylüyorum yani sanki 3. satırın genişliğini azaltsanız bile diğer satırlar bu durumdan ötürü taşmaya devam edecek.

Yerinizde olsam width: geometry.size.width / 12 kısmındaki 12'yi azaltmayı deneyebilirdim.

Ayrıca:

Swift:
Spacer(minLength: geometry.size.width / 36) // Daha küçük kenar boşluğu

Tahminimce buradaki elementin iki yanında da HStack(spacing: 4) kısmından dolayı 4'er birimlik boşluklar oluşuyor. Çıktıdan yola çıkarak söylüyorum. İstediğiniz şey bu değil sanki, yazdığınız yoruma bakarsak.



@ArdaReis_00, nasıl bir çözüm buldunuz? Çıktıyı da merak ettim.
 
Son düzenleme:
Çözüm