フリープログラマー日記

iOS,アンドロイド開発を気ままにしながら生きてるおじさんのブログです。

第10回 とりあえず解決!

NSStringのメソッドを調べていたら、ありましたね。

NSString.size(withAttributes: NSAttributeStringKey : Any])

要するに、文字属性=フォントサイズとかを決めたら、そのサイズを返してくれると言う便利なメソッドですね。
ありそうだし、「お前、そんなん知らんかったん?」とか、言われそう。

ま、これを利用する事で、こうなりました。

f:id:momonga117:20180512104116p:plain

トラックの線が微妙に違うのが気になりますね。

今回のswiftのコードはこちら。

        menuBigChar(string: "Entry", width: viewWidth, y: upper, position: 0)
        menuBigChar(string: "Run", width: viewWidth, y: lower, position: 0)
        menuBigChar(string: "Setting", width: viewWidth, y: upper, position: 1)
        menuBigChar(string: "Record", width: viewWidth, y: lower, position: 1)
        
    }
    
    
    func menuBigChar(string: String,width: CGFloat, y: CGFloat , position: Int) {
    
        // この関数は緑色の文字を大きめのサイズで右に傾けた表示をするように特化しています。
        // 引数は、表示文字、画面幅、上下位置(y座標)、ポシション(左0、右1)
    
        let charSize: CGFloat = width * 0.1   // サイズは横幅の10%くらい
        
        // 文字属性(色、フォント、サイズ、寄せ方、傾き)
        let stringAttributes: [NSAttributedStringKey : Any] = [
            NSAttributedStringKey.foregroundColor : UIColor.green,
            NSAttributedStringKey.font : UIFont.italicSystemFont(ofSize: charSize)
        ]
        
        // stringの描画(NSStringに変換してdrawメソッドを使う)
        let nsstr = string as NSString
        
        // 表示位置の計算
        var textTopLeft: CGPoint   // 描画開始位置(左上)
        
        // サイズをあらかじめ取得
        var  textSize: CGSize = nsstr.size(withAttributes: stringAttributes)
        
        if position == 1 {
            // 画面右寄せ
            textTopLeft = CGPoint(x: width*0.95 - textSize.width, y: y - textSize.height)
            
        } else {
            // 画面左寄せ
            textTopLeft = CGPoint(x: width*0.05, y: y - textSize.height)
        }
        
        // 実際の描画
         nsstr.draw(in: CGRect(origin: textTopLeft, size: textSize), withAttributes: stringAttributes)
    }


途中、1が右、0が左としていますが、ちょっと恥ずかしいですね。

enum使って文字で書くように変えていきます。

swiftだと

    enum stringPosition: Int {
        case LEFT
        case RIGHT
    }

JAVAだと

    enum stringPosition {
        LEFT,
        RIGHT
    }

こんな感じですね。

文字の扱いがだいたいできそうになってきたので、あとは、メニュー画面完成まで一気にやっていきます。

土日はプログラムが捗り(はかどり)ます。