読者です 読者をやめる 読者になる 読者になる

Swift,Objective-Cプログラミング ~ iOS ~

Objective-C,Swift,Apple Watchなどのプログラミング

【iOS Swift入門 #291】グラデーションしているViewをつくる

この記事読んでわかること

  • グラデーションしているViewをつくる

やり方

CAGradientLayerを使う。

このCAGradientLayerで下記の内容を設定してグラデーションを作る。 - グラデーションの方向 - 色を切り替える地点 - 切り替える色

グラデーションの方向

startPointプロパティとendPointプロパティを使う。 startPointからendPointに向かってグラデーションされる。

水平方向にグラデーション

startPointをx=0.0 y=0.0
endPointをx=1.0 y=0.0 にする。

f:id:fjswkun:20161123125302p:plain

垂直方向にグラデーション

startPointをx=0.0 y=0.0
endPointをx=0.0 y=1.0 にする。

f:id:fjswkun:20161123125343p:plain

右下方向にグラデーション

startPointをx=0.0 y=0.0
endPointをx=1.0 y=1.0 にする。

f:id:fjswkun:20161123125430p:plain

色を切り替える地点

グラデーションする方向に向かって、どの地点で色を切り替えるかを指定する。
色を変える地点を0.0から1.0で指定する。
配列で指定する。

切り替える色

色を切り替える地点でどの色に切り替えるかを指定する。
配列で指定する。

垂直方向にグラデーションをさせる。

f:id:fjswkun:20161123125343p:plain

import UIKit

class ViewController: UIViewController {
    var gradationLayer:CALayer = {
        let gradientLayer = CAGradientLayer()
        // グラデーションの方向
        gradientLayer.startPoint = CGPoint(x: 0.0, y: 0.0)
        gradientLayer.endPoint = CGPoint(x: 0.0, y: 1.0)
        
        // 色が切り替わる地点
        let locations:[NSNumber] = [
            0.125, 0.250, 0.375, 0.500, 0.625, 0.750, 0.875
        ]
        gradientLayer.locations = locations
        
        // 切り替わる色
        let colors = [
            UIColor.red.cgColor, UIColor.blue.cgColor, UIColor.black.cgColor,
            UIColor.white.cgColor, UIColor.yellow.cgColor, UIColor.orange.cgColor, UIColor.cyan.cgColor
        ]
        gradientLayer.colors = colors
        return gradientLayer
    }()

    override func viewDidLoad() {
        super.viewDidLoad()

        // グラデーションの大きさ、位置の設定
        gradationLayer.frame = view.bounds
        
        // グラデーションをViewに追加
        view.layer.addSublayer(gradationLayer)
    }
}

ダウンロード

こちらからダウンロード。
SampleGradationView.zip - Google ドライブ

参考情報

Swift

iOSアプリ開発未経験の人向け
・Swift初心者の人に評判が良いようですね


・わかりやすくていい、と聞いた本
立ち読みした感じだと【アプリ作成未経験の人向け】

絶対に挫折しない iPhoneアプリ開発「超」入門【Swift & iOS8.1以降 完全対応】

絶対に挫折しない iPhoneアプリ開発「超」入門【Swift & iOS8.1以降 完全対応】


②を終えたくらいの知識の方向け
・アプリ開発独学中に2冊めに購入した書籍
プログラミング知識はなくても、若干理解するのに時間がかかる程度で、
読み進められるわかりやすさがある。

iPhoneアプリ開発塾

iPhoneアプリ開発塾


③中級者、上級者向け

詳解 Swift

詳解 Swift

詳解 Swift 改訂版

詳解 Swift 改訂版


【iOS Swift入門 #290】文字列・テキストをUILabelに表示するために必要な領域サイズを計算する

はじめに

文字列・テキストの表示に必要な領域サイズを得るときに、
NSStringやNSAttributedStringクラスの
boundingRect(with:options:context:)メソッドを使う。

このメソッドで得た領域サイズでUILabelを作成し、
文字列をセットし、画面表示してみると、
切れて表示されるということがある。

UILabelに表示できるサイズを得る処理を作った。

この記事を読んでわかること

  • 文字列・テキストをUILabelに表示するために必要な領域サイズを計算する方法

やりかた

ソース

extension String{
    // calculate label size to show
    func size(for label:UILabel) -> CGSize{
        let alabel = label.clone()
        alabel.text = self
        alabel.sizeToFit()
        
        return alabel.bounds.size
    }
}

extension UILabel{
    // clone UILabel object
    func clone() -> UILabel{
        let data = NSKeyedArchiver.archivedData(withRootObject: self)
        return NSKeyedUnarchiver.unarchiveObject(with: data) as! UILabel
    }
}

文字列がぴったり入るUILabelのサイズを得られる。
f:id:fjswkun:20161120122031p:plain

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        // string
        let str = "Hello, World!!!"
        
        // initialize UILabel
        let label = UILabel(frame: CGRect.zero)
        label.backgroundColor = .cyan
        label.text = str
        
        // calculate label size to show
        let size = str.size(for: label)
        
        // add
        label.frame = CGRect(origin: CGPoint.zero, size: size)
        label.center = view.center
        view.addSubview(label)
    }
}

サンプルソースのダウンロード

こちらからダウンロード。
SampleGetLabelSize.zip - Google ドライブ

参考情報

Swift

iOSアプリ開発未経験の人向け
・Swift初心者の人に評判が良いようですね


・わかりやすくていい、と聞いた本
立ち読みした感じだと【アプリ作成未経験の人向け】

絶対に挫折しない iPhoneアプリ開発「超」入門【Swift & iOS8.1以降 完全対応】

絶対に挫折しない iPhoneアプリ開発「超」入門【Swift & iOS8.1以降 完全対応】


②を終えたくらいの知識の方向け
・アプリ開発独学中に2冊めに購入した書籍
プログラミング知識はなくても、若干理解するのに時間がかかる程度で、
読み進められるわかりやすさがある。

iPhoneアプリ開発塾

iPhoneアプリ開発塾


③中級者、上級者向け

詳解 Swift

詳解 Swift

詳解 Swift 改訂版

詳解 Swift 改訂版


【iOS Swift入門 #289】UILabelオブジェクトを複製・コピーする

はじめに

UILabelオブジェクトを複製したいということがあるかも、
ということでやりかたを調べた。

やりかた

NSKeyedArchiverクラスでNSDataにアーカイブし、
NSKeyedUnarchiverクラスで復元することで、
別のオブジェクトとしてUILabelが作成される

ソース

// Clone UILabel with Swift
extension UILabel{
    func clone() -> UILabel{
        let data = NSKeyedArchiver.archivedData(withRootObject: self)
        return NSKeyedUnarchiver.unarchiveObject(with: data) as! UILabel
    }
}

例:コンソールで確認

// Sample
let label = UILabel(frame: CGRect.zero)
let cloned = label.clone()
cloned.text = "cloned label"
label.text = "original label"

print("\(cloned.text)")  // cloned label

例:画面で確認

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        // original
        let original = UILabel(frame: CGRect.zero)
        original.backgroundColor = UIColor.black
        original.textColor = UIColor.white
        original.text = "This is original UILabel object"
        original.sizeToFit()
        original.center = view.center
        
        // copy
        let copied = original.clone()
        copied.text = "This is copied UILabel object"
        copied.sizeToFit()
        copied.center = CGPoint(x: original.center.x, y: original.center.y + 50.0)
        
        // add
        view.addSubview(original)
        view.addSubview(copied)
    }
}

extension UILabel{
    func clone() -> UILabel{
        let data = NSKeyedArchiver.archivedData(withRootObject: self)
        return NSKeyedUnarchiver.unarchiveObject(with: data) as! UILabel
    }
}

サンプルソースのダウンロード

こちらからダウンロード。
SampleCloneLabel.zip - Google ドライブ

参考情報

Swift

iOSアプリ開発未経験の人向け
・Swift初心者の人に評判が良いようですね


・わかりやすくていい、と聞いた本
立ち読みした感じだと【アプリ作成未経験の人向け】

絶対に挫折しない iPhoneアプリ開発「超」入門【Swift & iOS8.1以降 完全対応】

絶対に挫折しない iPhoneアプリ開発「超」入門【Swift & iOS8.1以降 完全対応】


②を終えたくらいの知識の方向け
・アプリ開発独学中に2冊めに購入した書籍
プログラミング知識はなくても、若干理解するのに時間がかかる程度で、
読み進められるわかりやすさがある。

iPhoneアプリ開発塾

iPhoneアプリ開発塾


③中級者、上級者向け

詳解 Swift

詳解 Swift

詳解 Swift 改訂版

詳解 Swift 改訂版


【iOS Swift入門 #288】UILabelやUIButtonに表示している文字列のフォントサイズを自動調整させる

はじめに

UILabelやUIButtonのサイズは固定で、表示する文字列が短かったり、
長かったりと動的に設定される。

その際、文字列が長くて、文字列の後ろが切れてしまう場合、
文字列のサイズを小さくして、(できるかぎり)全ての文字列を表示したい、
という場合があります。

この記事を読んでわかること

  • UILabelやUIButtonに表示している文字列のフォントサイズを自動調整させる

自動調整させるには?

UILabelにはフォントサイズを自動調整させるためのプロパティがある。
これらのプロパティを設定することで自動調整させることができる。

adjustsFontSizeToFitWidthをtrueにすると自動調整が有効になる。
minimumScaleFactorはUILabelに収まらない場合、
どのくらいまで文字列を縮小されるかを0.0から1.0で指定する。

これらのプロパティはIB(Interface Builder)でも設定できる。

なお、UIButtonの場合、titleLabelプロパティから上記プロパティを設定する。

自動調整させない場合

表示できない部分は...でトランケートされる。

ソース

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        view.backgroundColor = UIColor.lightGray
        
        // UILabelの表示
        let str = "Hello, World!!!"
        let label = UILabel(frame: CGRect(origin: CGPoint.zero, size: CGSize(width: 60, height: 20)))
        label.text = str
        label.center = view.center
        view.addSubview(label)
    }
}

スクリーンキャプチャ

f:id:fjswkun:20161119145208p:plain

自動調整させた場合

全ての文字列を表示できるように文字サイズが縮小される。

ソース

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        view.backgroundColor = UIColor.lightGray
        
        // UILabelの表示
        let str = "Hello, World!!!"
        let label = UILabel(frame: CGRect(origin: CGPoint.zero, size: CGSize(width: 60, height: 20)))
        label.adjustsFontSizeToFitWidth = true  // 自動調整を有効にする
        label.minimumScaleFactor = 0.5  // 半分の大きさまで縮小させられる
        label.text = str
        label.center = view.center
        view.addSubview(label)
    }
}

スクリーンキャプチャ

f:id:fjswkun:20161119145325p:plain


サンプルソースのダウンロード

SampleLabelText.zip - Google ドライブ

参考情報

Swift

iOSアプリ開発未経験の人向け
・Swift初心者の人に評判が良いようですね


・わかりやすくていい、と聞いた本
立ち読みした感じだと【アプリ作成未経験の人向け】

絶対に挫折しない iPhoneアプリ開発「超」入門【Swift & iOS8.1以降 完全対応】

絶対に挫折しない iPhoneアプリ開発「超」入門【Swift & iOS8.1以降 完全対応】


②を終えたくらいの知識の方向け
・アプリ開発独学中に2冊めに購入した書籍
プログラミング知識はなくても、若干理解するのに時間がかかる程度で、
読み進められるわかりやすさがある。

iPhoneアプリ開発塾

iPhoneアプリ開発塾


③中級者、上級者向け

詳解 Swift

詳解 Swift

詳解 Swift 改訂版

詳解 Swift 改訂版


【iOS Swift入門 #287】関数・メソッドのパラメータにvarを指定できないように変更 [Swift3.0]

関数・メソッドのパラメータにvarを指定できないように変更

Swift3.0以前にこれができることを知らなかった。
変更された理由はvarとinoutが混同してしまうことがあるから。

変更前(Swift3.0からはエラーになる)

import UIKit

// 関数・メソッド内で変更できるが、呼び出し元は変更されない
func sayHello(var name:String){
    name = name + "さん、こんにちは"
    print(name)
}

sayHello(name:"田中")  // 田中さん、こんにちは

変更後

import UIKit

func sayHello(name:String){
    let greeting = name + "さん、こんにちは"
    print(greeting)
}

sayHello(name:"田中")  // 田中さん、こんにちは

inoutの使い方

import UIKit

// 呼び出し元が変更される
func sayHello(name:inout String){
    name = name + "さん、こんにちは"
    print(name)
}

var name = "田中"
sayHello(name:&name)  // 田中さん、こんにちは
print(name)  // 田中さん、こんにちは


参考情報

Swift

iOSアプリ開発未経験の人向け
・Swift初心者の人に評判が良いようですね


・わかりやすくていい、と聞いた本
立ち読みした感じだと【アプリ作成未経験の人向け】

絶対に挫折しない iPhoneアプリ開発「超」入門【Swift & iOS8.1以降 完全対応】

絶対に挫折しない iPhoneアプリ開発「超」入門【Swift & iOS8.1以降 完全対応】


②を終えたくらいの知識の方向け
・アプリ開発独学中に2冊めに購入した書籍
プログラミング知識はなくても、若干理解するのに時間がかかる程度で、
読み進められるわかりやすさがある。

iPhoneアプリ開発塾

iPhoneアプリ開発塾


③中級者、上級者向け

詳解 Swift

詳解 Swift

詳解 Swift 改訂版

詳解 Swift 改訂版


【iOS Swift入門 #286】Carthageのビルドで「failed with exit code 65」が出たときにした対応の話

この記事を読んでわかること

  • Carthageのビルドで「failed with exit code 65」が出たときにした対応

現象

carthage updateするとSwiftDateという
オープンソースだけエラーが発生する。

*** Building scheme "SwiftDate" in SwiftDate.xcworkspace
** CLEAN FAILED **


The following build commands failed:
    Check dependencies
(1 failure)
** BUILD FAILED **


The following build commands failed:
    Check dependencies
(1 failure)
A shell task (/usr/bin/xcrun xcodebuild -workspace "/Users/abcde/Development/git/myproject/Carthage/Checkouts/SwiftDate/SwiftDate.xcworkspace" -scheme SwiftDate -configuration Release -sdk iphoneos ONLY_ACTIVE_ARCH=NO BITCODE_GENERATION_MODE=bitcode CODE_SIGNING_REQUIRED=NO CODE_SIGN_IDENTITY= CARTHAGE=YES clean build) failed with exit code 65:
** CLEAN FAILED **


The following build commands failed:
    Check dependencies
(1 failure)
** BUILD FAILED **


The following build commands failed:
    Check dependencies
(1 failure)

調査

いろいろ調べた。
でもよくわからなかった。

何気なく、プロジェクトフォルダ配下の
Carthage → CheckoutsにあるSwiftDateのプロジェクトを開いた。

すると、バージョンに「2.0.x」と表示された。(最新は4.0.x)
carthage updateしても最新のソースが
ダウンロードされていなかったと思われる。

最新のソースがダウンロードされなかった理由は不明。

きっとこれが原因と思い、↓の対応を行った。

対応

  1. プロジェクトフォルダ配下のCarthage → CheckoutsにあるSwiftDateのフォルダ削除。
  2. carthage update

結果

めでたく成功。


参考情報

Swift

iOSアプリ開発未経験の人向け
・Swift初心者の人に評判が良いようですね


・わかりやすくていい、と聞いた本
立ち読みした感じだと【アプリ作成未経験の人向け】

絶対に挫折しない iPhoneアプリ開発「超」入門【Swift & iOS8.1以降 完全対応】

絶対に挫折しない iPhoneアプリ開発「超」入門【Swift & iOS8.1以降 完全対応】


②を終えたくらいの知識の方向け
・アプリ開発独学中に2冊めに購入した書籍
プログラミング知識はなくても、若干理解するのに時間がかかる程度で、
読み進められるわかりやすさがある。

iPhoneアプリ開発塾

iPhoneアプリ開発塾


③中級者、上級者向け

詳解 Swift

詳解 Swift

詳解 Swift 改訂版

詳解 Swift 改訂版


【iOS Swift入門 #285】CoreAnimationを使ったスプリングアニメーション(CASpringAnimation)

この記事を読んでわかること

  • CoreAnimationを使ったスプリングアニメーション

CASpringAnimationで使うプロパティについて

CoreAnimation Frameworkにある CASpringAnimationクラスを使う。
(Deployment TargetがiOS9.0以上である必要あり)

  • damping この値が大きいほど、振り子の振幅がすぐに小さくなる
  • mass 値が大きいほど、振り子が振れる時間が長くなる
  • stiffiness この値が大きいほど、振り子の振幅がすぐに小さくなる
  • initialVelocity この値が大きいほど、アニメーション開始直後の速度が速い

サンプル

ログイン画面でユーザー名、パスワードの入力が
4文字未満の場合にテキストフィールドにアニメーションさせ、
ユーザーに間違っていることを伝えるサンプルです。

UITextFieldDelegateのtextFieldDidEndEditingを使って、
ユーザー名、パスワードの入力を終えたときに
4文字未満かどうかチェックしています。

func textFieldDidEndEditing(_ textField: UITextField) {
    
    guard let input = textField.text else{ return }
    
    // less than 4 characters, invalid.
    if input.characters.count < 4{
        let invalidAnimation = CASpringAnimation(keyPath: "transform.scale")
        invalidAnimation.fromValue = 1.25
        invalidAnimation.toValue = 1.0
        invalidAnimation.initialVelocity = 30.0
        invalidAnimation.damping = 15.0
        invalidAnimation.stiffness = 120.0
        invalidAnimation.duration = invalidAnimation.settlingDuration  // アニメーション終了時間を自動計算
        textField.layer.add(invalidAnimation, forKey: nil)
        
        textField.backgroundColor = UIColor.red
    }else{
        textField.backgroundColor = UIColor.white
    }
}

damping、mass、stiffiness、initialVelocityについて、 思い描いているアニメーションを実現する値を見つけるのは難しいので、 値をいじっては動かしてみて確認するというやり方でアニメーションを作っています。

また、大きさだけでなく、色などのプロパティに対しても、
アニメーションさせられるので、試してみると面白いかもしれません。

サンプルソースはこちらからダウンロードできます。
SampleCASpringAnimation.zip - Google ドライブ


参考情報

Swift

iOSアプリ開発未経験の人向け
・Swift初心者の人に評判が良いようですね


・わかりやすくていい、と聞いた本
立ち読みした感じだと【アプリ作成未経験の人向け】

絶対に挫折しない iPhoneアプリ開発「超」入門【Swift & iOS8.1以降 完全対応】

絶対に挫折しない iPhoneアプリ開発「超」入門【Swift & iOS8.1以降 完全対応】


②を終えたくらいの知識の方向け
・アプリ開発独学中に2冊めに購入した書籍
プログラミング知識はなくても、若干理解するのに時間がかかる程度で、
読み進められるわかりやすさがある。

iPhoneアプリ開発塾

iPhoneアプリ開発塾


③中級者、上級者向け

詳解 Swift

詳解 Swift

詳解 Swift 改訂版

詳解 Swift 改訂版