swift로 hud 만드는 step1

15403 단어 Swift
hud를 만드는 과정에서 눈에 띄는 일 등의 필기
지금 만들고 있어요.
https://github.com/pixel-ink/PIhud
소스가 들어있어요.

배경에서 그림 배열하기



이렇게 그림을 배열합니다.

갖고 싶어요.
UIImage가 아닌 UIColor를 사용합니다.
예제
view.backgroundColor = UIColor(patternImage: UIImage(named: "pattern.png")! )
Groupe Table View Background Color에 무늬가 있는 것은 놀라운 구조입니다.

CGRect 제작 시 쓰기 어려워요


이미지를 중심에 두려는 경우 UIViewContentModeCenter를 사용해야 한다고 생각하지만 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
}
클래스를 여러 번 만들 때 마지막 설정 값을 기억하려면 선택하십시오
비이실성이라면 User Defaults에 저장하고 휘발성이 좋으면singleton Class에 저장하고 싶습니다.
이번에는 후자를 사용했다.
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 나왔습니다
  • 제작이 아직 거칠다
  • 토스트와 프로그레스(Spinner)
  • 나왔으면 좋겠어요.

    좋은 웹페이지 즐겨찾기