1

Swift를 사용하여 프로그래밍 방식으로 육각형 UIButton을 만들고 싶습니다. 나는 녹색의 그림을 볼 수 있듯이 육각형 이미지를 가지고있다. 가장자리는 투명하기 때문에 해당 영역을 클릭하면 안됩니다. "custom"옵션을 사용하여 기본 UIButton을 사용하면이 영역을 계속 클릭 할 수 있습니다. enter image description hereSwift로 Hexagon UIButton 또는 Clickable ImageView를 프로그래밍 방식으로 작성하는 방법

그런 다음 아래 이미지를 UIScrollView에 추가하십시오. 가장 중요한 것은 사용자가 하나의 버튼을 클릭 할 때 올바른 버튼의 ID를 얻어야한다는 것입니다.

Example

그래서, 당신은 육각형있는 UIButton 또는 클릭 가능한 이미지 뷰를 작성 좀 도와 수 있습니까? 감사.

답변

2

투명한 이미지 부분에서 터치 이벤트를 감지하지 않도록 UIButton 클래스를 확장 할 수 있습니다.

우리는 터치 지점에서 이미지의 알파 성분을 감지합니다.

알파 성분이 0이면 히트 테스트가 실패합니다.
알파가 0이 아니면 히트 테스트가 성공합니다.
터치가 단추 범위 밖에있는 경우 적중 테스트도 실패합니다.

extension UIButton { 

    func getColourFromPoint(point:CGPoint) -> UIColor { 
      let colorSpace:CGColorSpace = CGColorSpaceCreateDeviceRGB() 
      let bitmapInfo = CGBitmapInfo(CGImageAlphaInfo.PremultipliedLast.rawValue) 

      var pixelData:[UInt8] = [0, 0, 0, 0] 

      let context = CGBitmapContextCreate(&pixelData, 1, 1, 8, 4, colorSpace, bitmapInfo) 
      CGContextTranslateCTM(context, -point.x, -point.y); 
      self.layer.renderInContext(context) 

      var red:CGFloat = CGFloat(pixelData[0])/CGFloat(255.0) 
      var green:CGFloat = CGFloat(pixelData[1])/CGFloat(255.0) 
      var blue:CGFloat = CGFloat(pixelData[2])/CGFloat(255.0) 
      var alpha:CGFloat = CGFloat(pixelData[3])/CGFloat(255.0) 

      var color:UIColor = UIColor(red: red, green: green, blue: blue, alpha: alpha) 
      return color 
    } 

    public override func hitTest(point: CGPoint, withEvent event: UIEvent?) -> UIView? { 
     if (!CGRectContainsPoint(self.bounds, point)) { 
      return nil 
     } 
     else { 
      let color : UIColor = self.getColourFromPoint(point) 
      let alpha = CGColorGetAlpha(color.CGColor); 
      if alpha <= 0.0 { 
       return nil 
      } 
      return self 
     } 
    } 
}