Help us understand the problem. What is going on with this article?

swiftでhudをつくる step1

More than 5 years have passed since last update.

hudを作っていく中で、気づいたこと等のメモです

作っている途中ですが、
https://github.com/pixel-ink/PIhud
にソースがあります

背景に画像を並べたい

pattern.png

のような画像を並べて

スクリーンショット 2015-04-30 4.53.10.png

にしたい。

UIImageではなく、UIColorを使います。

view.backgroundColor = UIColor(patternImage: UIImage(named: "pattern.png")! )

Groupe Table View Background Colorに模様がつくのが不思議だったのですが、こういう仕組みなんですね。

CGRectを作るときに、書きにくい

ある画像を中心に置きたい場合は、UIViewContentMode.Centerを使うと思いますが、CoreGraphicsを使っている場合などには自力で計算する必要があります。

Center
CGRectMake((container.frame.size.width - image.size.width) / 2, (container.frame.size.width.height - image.size.height) / 2, image.size.width, image.size.height)

少し長くて書きにくいと思ったので、縮めて書けるようにextentionを作ってみました

extention
private extension UIView {
  var size: CGSize { return self.frame.size }
  var x: CGFloat { return self.frame.origin.x }
  var y: CGFloat { return self.frame.origin.y }
  var w: CGFloat { return self.frame.size.width }
  var h: CGFloat { return self.frame.size.height }
}

private extension CGRect {
  var x: CGFloat { return self.origin.x }
  var y: CGFloat { return self.origin.y }
  var w: CGFloat { return self.size.width }
  var h: CGFloat { return self.size.height }
}

private extension CGSize {
  var w: CGFloat { return self.width }
  var h: CGFloat { return self.height }
}

なんだか無理やりですが、これを使うと、短く書けます。

Center
CGRectMake((container.w - image.w) / 2, (container.h - image.h) / 2, image.w, image.h)

aspectFitやascpectFillも使いたいので、関数にしておきます。

ContentMode
class func center(aspect:CGSize, bound:CGSize) -> CGRect {
  let x = (bound.w - aspect.w) / 2
  let y = (bound.h - aspect.h) / 2
  return CGRectMake(x, y, aspect.w, aspect.h)
}

class func aspectFit(aspect:CGSize, bound:CGSize) -> CGRect {
  let scale = min(bound.w / aspect.w, bound.h / aspect.h)
  let size = CGSizeMake(aspect.w * scale, aspect.h * scale)
  return center(size, bound:bound)
}

class func aspectFill(aspect:CGSize, bound:CGSize) -> CGRect {
  let w = bound.w / aspect.w
  let h = bound.h / aspect.h
  var out = bound
  if( h > w ){
    out.width = bound.h / aspect.h * aspect.w
  }else if( w > h ){
    out.height = bound.w / aspect.w * aspect.h
  }
  return center(out, bound: bound)
}

設定値を使う人が変更できるようにしたい

例として、変数speedを変更する場合を考えます。

var
class Hud {
  var speed = 1.0
}

何度もクラスを作る場合に、前回の設定値を覚えておくようにしたい場合は、
不揮発であればUserDefaultsに、揮発でよければSingletonClassに保存して置くと思います。
今回は後者を使いました。

Singleton
class HudConfig {
  var speed = 1.0
  class var shared: HudConfig {
    struct Static {
      static let instance: HudConfig = HudConfig()
    }
    return Static.instance
  }  
}

//HudがHudConfig.shared.speedを読みにいく

進捗

  • とりあえずHudがでるようになった
  • まだまだ作りが雑である
  • ToastやProgress(Spinner)を出せるようにしたい

スクリーンショット 2015-04-30 5.30.37.png

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした