UIImageを動的に増やす – Swift3
説明
addボタンを押すたびに二つの変数をインクリメントさせます。画像の表示位置を変えるための変数と、配列のユニークに使うための変数です。画像の表示位置を変えるための変数は80ずつインクリメントさせ、配列のユニークに使うための変数は1ずつインクリメントさせます。addボタンを押すたびに、uiimageの配列にuiimageをappendさせます。uiimageの名前を可変にするために、変数の名前を変数にします。辞書型を使って実装しました。
deleteボタンを押すたびに、配列の一番最後のオブジェクトを削除してremoveFromSuperview()
で配列の数を取得して削除します。配列は0から数えるため、-1にしないとエラーになります。
環境
- 動的
- swift
- swift3
- xcode9
- xcode
- uiimage
- remove
実装
// // ViewController.swift // Dynamically generate uiimage // // Created by ryosuke-hujisawa on 2017/10/22. // Copyright © 2017年 ryosuke-hujisawa. All rights reserved. // import UIKit class ViewController: UIViewController { //追加された画像を挿入削除する配列 var logoImages: [UIImageView] = [] //画像の位置を定めるための変数 var tapCount:Int = 0 //arrayを取り出したり挿入したりする配列に使う変数 var tapCountArray:Int = 0 //可変変数を使うための辞書型 var dic: Dictionary<String, Any> = [:] //可変変数を取り出すための変数 let varName = "" //uiimageを定義する let image1:UIImage = UIImage(named:"FreddieMercury")! override func viewDidLoad() { super.viewDidLoad() // 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. } /* 画像を追加する関数 */ @IBAction func add(_ sender: Any) { //80pt感覚で画像を配置する self.tapCount += 80 //辞書型から取り出すためにユニークな名前を画像につける dic[varName] = tapCount print("\(dic[varName]!)") //ユニークな番号に画像を挿入する dic[varName]! = UIImageView(image:image1) let rect:CGRect = CGRect(x:tapCount, y:tapCount, width:80, height:80) (dic[varName]! as! UIView).frame = rect //配列に画像を挿入する logoImages.append( dic[varName]! as! UIImageView ) print( logoImages ) //画像をviewに挿入する self.view.addSubview(logoImages[ tapCountArray ] ) print( logoImages[ tapCountArray ] ) print(tapCountArray) //配列の番号を増やしていく self.tapCountArray += 1 print(tapCountArray) } @IBAction func deleteImage(_ sender: Any) { self.tapCount -= 80 self.tapCountArray -= 1 print(tapCount) print(tapCountArray) //配列の最後の値をviewから画像を削除する logoImages[ logoImages.count - 1 ].removeFromSuperview() //配列の最後の値を削除する logoImages.removeLast() } }