LoginSignup
2

More than 3 years have passed since last update.

SwiftUI DragGesture & Text ScrollView の話

Posted at

SwiftのDragやUIScrollViewの挙動をSwiftUIで実現します

目的

まずは、新型ウイルスの被害にあっている方々にお悔みを申しあげます

  • 私の技術不足でUIScrollViewのようなテキストがスクロールするViewの作成に手こずりました
  • テキストの内容ですが ? Wikipediaの生物兵器を利用いたしました、ありがとうございました

忙しい人はContentView.swiftをすり替えてください

必要な条件

  • 新規作成で命名はお好みです
  • SwiftUIにチェックを入れること
  • 作成後はContentView.swiftをすり替えるだけです

ContentView.swift

ContentView.swift

//
//  ContentView.swift
//  SwiftUIView
//
//  Created by 福田 敏一 on 2020/02/13.
//  Copyright © 2020 株式会社パパスサン. All rights reserved.
//

import SwiftUI

struct ContentView: View {
    var body: some View {
        DragView(title: タイトル, text: テキスト)
    }

}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }

}

//////
//2020/01/08.
struct DragView: View {
    var title: String
    var text: String

    @State private var offset: CGSize = .zero
    @State private var newOffset: CGSize = .zero

    @State private var scale: CGFloat = 1.0

    var body: some View {
        let dragGesture = DragGesture()
        .onChanged({ value in
            self.offset.width = value.translation.width + self.newOffset.width
            self.offset.height = value.translation.height + self.newOffset.height
        }).onEnded({ value in
            self.offset.width = value.translation.width + self.newOffset.width
            self.offset.height = value.translation.height + self.newOffset.height
            self.newOffset.width = self.offset.width
            self.newOffset.height = self.offset.height
        })
            return Move画面(title: title, text: text)
            .offset(x: offset.width, y: offset.height)
            .gesture(dragGesture)
            .animation(.interactiveSpring())
        }

}

////
struct Move画面: View {
    var title: String
    var text: String

     var body: some View {
        VStack {
            TextScrollView(title: title, text: text)
        }
     }

}

////
//2020/02/12.
struct TextScrollView: View {
    var title: String
    var text: String

    var body: some View {
        VStack {
            Spacer()
            Text(title)
                .font(.largeTitle)
                .foregroundColor(.red)
            GeometryReader { geometry in
                RoundedRectangle(cornerRadius: 20, style: .continuous)
                    .fill(Color.purple)
                    .overlay(VStack {
                        ScrollView() {
                            Text(self.text)
                            .fixedSize(horizontal: false, vertical: true)
                        }.foregroundColor(.white)
                    }.padding()
                )
            }.frame(width: 400, height: 200)
             Spacer()
        }
    }

}

let タイトル: String = "生物兵器とは"
let テキスト: String = "生物兵器(せいぶつへいき)とは、細菌やウイルス、あるいはそれらが作り出す毒素などを使用し、人や動物に対して使われる兵器のこと。国際法(ジュネーヴ議定書)で使用が禁止されている。生物兵器を使用した戦闘を生物戦(せいぶつせん)という。\n\n歴史上、医学や細菌学の研究、生物兵器に対する防御法の研究という建前でひそかに開発が行われていたことがあり、現在でもその可能性は無いとは言えない。\n\n核兵器などに比べて簡単に入手ができ、ある程度の知識と設備があれば培養も容易で(失敗したとはいえ、オウム真理教が炭疽菌を培養して散布した)、与える被害が大きいことや以下の特徴からテロリズムなどに使われることが危惧されている。\n\n核兵器の開発は高度な技術と施設が不可欠であり、化学兵器も兵器として十分な量を製造するためにはそれに伴う規模の施設と原料が必要となる。核兵器、生物兵器、化学兵器の3つをあわせて大量破壊兵器、またはこれら3つの頭文字を取ってNBC兵器もしくはABC兵器と呼ぶが、この中でも生物兵器は、最も費用対効果に優れる。\n\nしかし生物兵器の中には、ある程度の知識と技術があれば大がかりな設備がなくても製造することができるものも存在する。反面、使用時の外部条件(例えば気象)に左右される部分が多いことや、与える被害を予測しにくく、その場で効果が現れることもないため、ほかの二つに比べると兵器としては使いにくい。だが例えば、世界的に甚大なダメージを無差別に与えることを目的とする場合など、生物兵器が有効である場面は多々存在する。\n生物兵器が化学兵器と大きく違うところは、細菌兵器を例にすると、感染してもすぐには効果が現れず、人から人への感染を起こすことである。\n\n感染の方法、感染力はさまざまであるが、生物兵器の多くは生物から生物へ感染する。化学兵器は風の影響や、付着していた化学兵器の蒸発による二次被害などがあるものの、基本的に被害は散布された周辺のみにとどまる。しかし生物兵器は感染者が移動することにより、広範囲にわたって影響を及ぼす。特に第二次世界大戦後は、丸一日あれば飛行機で世界のどこにでも行けるほど移動手段が発達しているため、被害は想像以上に大きくなる可能性がある。\n\n特にテロリズムに使用されやすいとする、もう一つの理由は潜伏期間の問題で、感染してから数日たってから発病するため、感染経路の特定が難しく、その間に実行犯は国外などへの逃走が可能となる。\n\n世界保健機関は、生物兵器はそれがもたらす傷病を別にしても、恐怖を与えるという意味で心理戦としても使用されるという[2]。\n\n実際に病原体がテロに使用された生物兵器テロ事件の例としては、2001年のアメリカ炭疽菌事件、日本国内では、オウム真理教による1993年の亀戸異臭事件(炭疽菌を使用、失敗に終わったためテロ未遂事件とされている)、そして同教団による1995年の霞が関のボツリヌス菌散布(こちらも失敗に終わった)が挙げられる。"


私の感想と意見ですが ?

理解すれば ? SwiftUIでテキストViewでScrollView方法はSwiftのそれよりとても簡単なんですね ? ポイントは ? Instance MethodのfixedSize(horizontal:vertical:)の理解でしょうね ? .fixedSize(horizontal: false, vertical: true)の2つのパラメータのhorizontalとverticalで水平とか垂直とかを固定するとか固定しないとかの内容ですね ?
また、ドラッグとかテキストスクロールViewを他からの呼び出しで利用できるように工夫しました

ここまで

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2