まだどこにもないアプリを作る

アプリ開発でつまづいたところなどを中心に記事にして行きます。

SwiftUI HStackで生まれる横の隙間を埋める

 

f:id:rils_k:20220321065228p:plain

この画像のように普通にHStackを使うだけだとUIとUIの間に隙間ができてしまいます。

import SwiftUI

 

struct HStackSpacing: View {

    var body: some View {

        HStack{

            Image(systemName: "crown")

            Text("1位")

        }.background(Color.gray)

    }

}

 

以下のようなコードに直すと解消できます。

struct HStackSpacing: View {

    var body: some View {

        HStack(spacing:0){

            Image(systemName: "crown")

            Text("1位")

        }.background(Color.gray)

    }

}

 HStackにspacing:0を追加しています。

f:id:rils_k:20220321065410p:plain

 

 

VStackでも同じようなことができました。

 

SwiftUIエラー thread 1: EXC_BAD_ACCESS (code=2, ~~~~~~ の原因の一例

EXC何ちゃらってエラーなので原因は様々だと思いますが

今回の私の場合の原因は

.ピリオドが抜けていたようです。

 

以下のコードでこのエラーを確認

Text("みかん").font(.custom("HiraMaruProN-W4", size: 8))

                frame(width: 80, height: 20)//frameの前の.ピリオドがない。これでもなぜかビルドは成功してしまう。

 

以下のコードにしたら直りました。

Text("みかん").font(.custom("HiraMaruProN-W4", size: 8))

                    .frame(width: 80, height: 20)

 

以下のサイト様を参考にさせていただきました。

list - Swift UI - Thread 1: EXC_BAD_ACCESS (code=2 - Stack Overflow

 

SwiftUI TextField 値受け渡した時のTextFieldの初期値

第一の画面があって

第二の画面があります。

 

第一の画面で作ったString変数を

第二の画面に受け渡して

 

そのString変数を第二の画面のTextFieldに表示させたい。

 

onAppearでStateのプロパティに代入してもTextFieldには反映されません。しかし

 

以下のように遅延処理をすることで可能になります。

@State var textFieldText = ""

 

TextField("テキストを入力", text:$textFieldText).onAppear {

            DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {

                textFieldText = receivedText//第一の画面から受け取った変数(receivedText)

            }

 

【SwiftUI】CoreData SortDescriptor を動的に使う。fetchResultsを動的に並び替える,ボタンを押したら並び替える

<読者の想定>

Coredataを使ってアプリを作成しており

最初にCoreDataを使うにチェックを入れてアプリを作成し、それを元にアプリを作成している人に向けて書いております。

f:id:rils_k:20220305132049p:plain

private var items: FetchedResults<Item>

 

items.sortDescriptors = [SortDescriptor(\Item.timestamp, order: .reverse)]

 

itemsはFetchResultsです

上記であればtimestampの日付順で降順に並び替えることができます。

 

動的に変更するコードはあまりネット上になかったのでなかなか苦労しました。

 

こちらのサイト様が参考になりました

www.raywenderlich.com

 

Oculus Integrationのリリースノートの見方のヒント リリース日の見方 Unity

 

↓が公式リリースノートです

Oculus Developer Center | Downloads

 

 

f:id:rils_k:20220226075915p:plain

上記の画像のように

バージョンのところにカーソルを当ててドロップダウンしたメニューから選択することで

過去のバージョンのリリース日やリリース内容を確認することができます。

 

 

過去のバージョンをダウンロードしたい場合は

下のリンクからダウンロードできます

f:id:rils_k:20220226080343p:plain

Oculus Developer Center | Downloads

 

バージョンのところにカーソルを当ててドロップダウンしたメニューから選択。

それから青いダウンロードボタンからダウンロードできますよ。

 

 

 

こちらの方の記事を全面的に参考にさせていただきました。

ありがとうございます。

詳しくは↓の記事をご覧くださいませ。

bibinbaleo.hatenablog.com

 

 

プロジェクトを作成できません unity 対処方法の一例

 

2021.2.13f1のunityをインストールしてみました。

 

外付けハードディスクにインストールしたのですが、「Editor」というファイル名でインストールされた。

これだとUnityエディターが入っているファイルってわかりづらいので

 

他のわかりやすい名前「UnityEditor」みたいな名前でフォルダを作って、そこにさっきインストールしたunityを丸ごと入れたところ

 

 

「プロジェクトを作成できません unity」

 

 

というエラーでプロジェクトを作成できませんでした。

 

「Editor」というファイル名で最初のインストールされた場所にファイルを戻したら

エラーは出なくなりました。

 

 

少しでもディレクトリの構造が違うと起動できないのかもしれません。

ファイル名がわかりづらいですが妥協することにしました。

 

Swift5 UIKit セルをロングタップして検知 セルのインデックス番号も取得できる方法

teratail.com

上記のサイト様を参考にさせていただきました。

 

swift5 cellをロングタップした時の動作

 

 

override func viewDidLoad() {

        super.viewDidLoad()

//セルのロングタップジェスチャー

        let longPressRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(rowButtonAction(_:)))

        longPressRecognizer.allowableMovement = 15

        longPressRecognizer.minimumPressDuration = 0.5

        tableView1.addGestureRecognizer(longPressRecognizer)

 

@objc func rowButtonAction(_ sender: UILongPressGestureRecognizer) {

        let point: CGPoint = sender.location(in: tableView1)

        let indexPath = tableView1.indexPathForRow(at: point)

        if let indexPath = indexPath {

            if sender.state == UIGestureRecognizer.State.began {

                // セルが長押しされたときの処理

                print("long pressed \(indexPath.row)")

            }

        }else{

            print("long press on table view")

        }

    }

 

このやり方はtableViewにおいてタップしたところの座標をもとにセル番号を検知しているようです。

座標からなんて荒いやり方だな、と思いましたが

それ用のApple公式のメソッドがあるので正確にインデックスが取得できます。

 

 

ちなみにただセルにロングタップジェスチャーをつけたいだけだったら以下の書き方もできます。このやり方でindex番号を取得することは私は断念しました。

cellForRowAt内に以下のコード

//セルに長押し検知機能 

                let recognizer = UILongPressGestureRecognizer(target: self, action: #selector(onLongPressCell(_:)))

                recognizer.minimumPressDuration = 0.5

                cell.contentView.isUserInteractionEnabled = true

                cell.contentView.addGestureRecognizer(recognizer)

 

関数かく場所に以下のコード

//MARK: セル ロングタップの時の動作

    @objc func onLongPressCell(_ sender: UILongPressGestureRecognizer) {

        print("セルロングタップの時の動作")

        var onceLongTapNum = 0

        if sender.state == .began {

            onceLongTapNum += 1//何回も反応してしまうのを防ぐ

            if onceLongTapNum == 1{

                print("ロングタップ")

            }

        }else if sender.state == .ended {

            onceLongTapNum = 0

        }

    }