UserDefaultsは手軽にデータの永続化ができる
インスタンスの作成は UserDefaults.standard
随机应变 ABCD: Always Be Coding and … : хороший
UserDefaultsは手軽にデータの永続化ができる
インスタンスの作成は UserDefaults.standard
gooが押された時に、arc4randomの結果をif else文で出し分ける。
@IBAction func getGoo(_ sender: Any) { let results1 = ["Image1","Image2","Image3"] let random1 = arc4random_uniform(UInt32(results1.count)) let image1 = UIImage(named: results1[Int(random1)]) imageView.image = image1 let image4 = UIImage(named: "Image4") imageView2.image = image4 let even = "あいこ" let win = "あなたの勝ち" let lose = "あなたの負け" if random1 == 0 { self.gameResult.text = even } else if(random1 == 1){ self.gameResult.text = win } else { self.gameResult.text = lose } }
勝ち負けが出るようになりました。
グーチョキパー出したい。
同じように関数の中に分岐を書くと、できる。
最後、連勝・連敗を表示したい。
その為には、変数を宣言して、値(n)を保存して if n = 0 勝ちなら +1、負けなら-1、if n > 0 で勝ちなら +1、あいこならそのまま、負けならリセット、if < 0 で負けなら、-1、あいこならそのまま、勝ちならリセット。
そもそも変数を保存できるか?
storyboardのconstrainのerror解消がわからず、時間がかかりましたが、
@IBAction func getGoo(_ sender: Any) { let results1 = ["Image1","Image2","Image3"] let random1 = arc4random_uniform(UInt32(results1.count)) let image1 = UIImage(named: results1[Int(random1)]) imageView.image = image1 let image4 = UIImage(named: "Image4") imageView2.image = image4 } @IBAction func getChoki(_ sender: Any) { let results2 = ["Image1","Image2","Image3"] let random2 = arc4random_uniform(UInt32(results2.count)) let image2 = UIImage(named: results2[Int(random2)]) imageView.image = image2 let image5 = UIImage(named: "Image5") imageView2.image = image5 } @IBAction func getPa(_ sender: Any) { let results3 = ["Image1","Image2","Image3"] let random3 = arc4random_uniform(UInt32(results3.count)) let image3 = UIImage(named: results3[Int(random3)]) imageView.image = image3 let image6 = UIImage(named: "Image6") imageView2.image = image6 } override func viewDidLoad() { super.viewDidLoad() imageView.contentMode = UIViewContentMode.center self.view.addSubview(imageView) imageView2.contentMode = UIViewContentMode.center self.view.addSubview(imageView2) // Do any additional setup after loading the view, typically from a nib. }
O~K~! 選択したグーチョキパーとランダムのグーチョキパーを表示します。
勝ちか負けかをテキストで表示したい
可能であれば、何連勝とかも。。できるのか?
@IBAction func getGoo(_ sender: Any) { let results1 = ["Image1","Image2","Image3"] let random1 = arc4random_uniform(UInt32(results1.count)) let image1 = UIImage(named: results1[Int(random1)]) imageView.image = image1 } @IBAction func getChoki(_ sender: Any) { let results2 = ["Image1","Image2","Image3"] let random2 = arc4random_uniform(UInt32(results2.count)) let image2 = UIImage(named: results2[Int(random2)]) imageView.image = image2 } @IBAction func getPa(_ sender: Any) { let results3 = ["Image1","Image2","Image3"] let random3 = arc4random_uniform(UInt32(results3.count)) let image3 = UIImage(named: results3[Int(random3)]) imageView.image = image3 }
let result, let randomを3回書くと、うまく表示されません。varだったら行けるのかもしれませんが。
以下が表示される
setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key
右クリックで対象のclassの接続を削除して再度コンパイル
まず、グーチョキパーを180° rotateさせたpngを用意します。
assetの画像をrotateしたグーチョキパーに置き換えます。
続いて、rotateしないグーチョキパーをassetに保存します。
compileするとグーチョキパーが逆になります。
「ポン」をグーチョキパーにしたい。
controllerviewにボタンを置いて、buttonのinspector painでimageを選択します。
なるほど!
UIImage(named:)をarc4random_uniformで表示します。
@IBOutlet weak var imageView: UIImageView! @IBAction func getJanken(_ sender: Any) { let results = ["Image1","Image2","Image3"] let random = arc4random_uniform(UInt32(results.count)) let image = UIImage(named: results[Int(random)]) imageView.image = image } override func viewDidLoad() { super.viewDidLoad() imageView.contentMode = UIViewContentMode.center self.view.addSubview(imageView) // Do any additional setup after loading the view, typically from a nib. }
ポンのbuttonを押すとグーチョキパーがランダムに表示されます。
OK
ポンのテキストを自分の出すグーチョキパーのボタンに変えたいですね。
ところで、
viewDidLoad は、ViewControllerのviewがロードされた後に呼び出される。
override func viewDidLoad() { super.viewDidLoad()
ところで、このsuperだが、親クラスのviewDidLoadを呼び出している。
継承を行った時あるいはsystemのデフォルト処理をする為に記述する必要がある。
overrideしてますね。
続いてdidReceiveMemoryWarningだが、その名の通り、メモリ不足時にdidReceiveMemoryWarningメソッドが呼ばれる
グー、チョキ、パーの画像を置いていきます。
これをどうやって、controller.swfitで呼び出すんだ?
let image = UIImage(named: “Image2”)でコンパイルしてみる。
override func viewDidLoad() { super.viewDidLoad() let image = UIImage(named: "Image2") imageView.image = image imageView.contentMode = UIViewContentMode.center self.view.addSubview(imageView) // Do any additional setup after loading the view, typically from a nib. }
あれ、UIImage(named: “ファイル名”)でいけますね。
すると、/app/hoge.jpg と /app/Aseets.xcassets/hoge 共にUIImage(named: “hoge”)で読み込める、ということですな。 詳細はわかりませんが、コンパイルする際に、同階層として扱っているんでしょう。
では、ボタンを押したら、グーチョキパーがランダムで表示されるよう作っていきたいと思います。
Asset Catalog ファイル(.xcassets):
画像を一元管理出来るようになり、画像ファイルの追加・削除・修正を行ってもプロジェクトファイル(.pbxproj)は変更されない
早速置いてみましょう。
Assets.xcassetsを押下すると、以下のような画面になります。
AppIconがデフォルトで入っています。AppIconをクリックすると
retina ディスプレイ対応を2x, 3xで表しています。
2xは、2倍ですね。
以下の画像をおきます。
あら、should be 80 x 80pix と言われました。
とりあえず、エミュレーターをbuildして見ます。
なに、なんか知らんがエラーになった。
やっぱり120px x 120でないとダメみたい。
本当なら、psdで編集したいが、横着してtoolでresizeします。
エラーが消えたのでコンパイルします。
bui1ld succeeded!
いいね、これ好きです。
うお、warningが出まくってる
きた! icon変わりました。niceです。
まず画像を用意する
チョキは適当な画像が見当たらなかった為、ピースサイン
続いてStory boardにUIImageViewを配置する
control でviweController.swiftに繋げて、UIImage(named: “janken_goo”)と書く
let image = UIImage(named: “janken_goo”)
imageView.image = image
class ViewController: UIViewController { @IBOutlet weak var imageView: UIImageView! override func viewDidLoad() { super.viewDidLoad() let image = UIImage(named: "janken_goo") imageView.image = image // Do any additional setup after loading the view, typically from a nib. } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } }
UIImageViewの画像サイズのままになっている。。
48x48pixなんだけどな。
それと、今日、本屋で立ち読みした本には、画像はAssets.xcassestsに置くと書いてあったが。。swift書くまえにいきなりつまづいた。
imageView.contentMode で画像の縦横サイズを指定出来るらしい。
override func viewDidLoad() { super.viewDidLoad() let image = UIImage(named: "janken_goo") imageView.image = image imageView.contentMode = UIViewContentMode.Center self.view.addSubview(imageView) // Do any additional setup after loading the view, typically from a nib. }
UIViewContentMode.Centerでerror, build出来ない。
なに???
いろいろなサイトを横断して、appleのdeveloper siteのuiviewcontentmodeを見てみる
https://developer.apple.com/documentation/uikit/uiviewcontentmode
case center The option to center the content in the view’s bounds, keeping the proportions the same.
なに? centerは小文字?
imageView.contentMode = UIViewContentMode.centerで再度build
override func viewDidLoad() { super.viewDidLoad() let image = UIImage(named: "janken_goo") imageView.image = image imageView.contentMode = UIViewContentMode.center self.view.addSubview(imageView) // Do any additional setup after loading the view, typically from a nib. }
おおおお、ファイヤー
iOS開発で初めてちょっと仕事した!