Detect if a user has typed an emoji character in UITextView

前端 未结 9 1665
醉话见心
醉话见心 2020-12-05 08:13

I have a UITextView and I need to detect if a user enters an emoji character.

I would think that just checking the unicode value of the newest character would suffic

9条回答
  •  粉色の甜心
    2020-12-05 08:48

    Here is the emoji detection method in Swift. It works fine. Hope it will help others.

     func isEmoji(_ character: String?) -> Bool {
    
            if character == "" || character == "\n" {
                return false
            }
            let characterRender = UILabel(frame: CGRect(x: 0, y: 0, width: 1, height: 1))
            characterRender.text = character
            characterRender.backgroundColor = UIColor.black  
            characterRender.sizeToFit()
            let rect: CGRect = characterRender.bounds
            UIGraphicsBeginImageContextWithOptions(rect.size, true, 0.0)
    
            if let contextSnap:CGContext = UIGraphicsGetCurrentContext() {
                characterRender.layer.render(in: contextSnap)
            }
    
            let capturedImage: UIImage? = (UIGraphicsGetImageFromCurrentImageContext())
            UIGraphicsEndImageContext()
            var colorPixelFound:Bool = false
    
            let imageRef = capturedImage?.cgImage
            let width:Int = imageRef!.width
            let height:Int = imageRef!.height
    
            let colorSpace = CGColorSpaceCreateDeviceRGB()
    
            let rawData = calloc(width * height * 4, MemoryLayout.stride).assumingMemoryBound(to: CUnsignedChar.self)
    
                let bytesPerPixel:Int = 4
                let bytesPerRow:Int = bytesPerPixel * width
                let bitsPerComponent:Int = 8
    
                let context = CGContext(data: rawData, width: Int(width), height: Int(height), bitsPerComponent: Int(bitsPerComponent), bytesPerRow: Int(bytesPerRow), space: colorSpace, bitmapInfo: CGImageAlphaInfo.premultipliedLast.rawValue | CGBitmapInfo.byteOrder32Big.rawValue)
    
    
    
            context?.draw(imageRef!, in: CGRect(x: 0, y: 0, width: width, height: height))
    
                var x:Int = 0
                var y:Int = 0
                while (y < height && !colorPixelFound) {
    
                    while (x < width && !colorPixelFound) {
    
                        let byteIndex: UInt  = UInt((bytesPerRow * y) + x * bytesPerPixel)
                        let red = CGFloat(rawData[Int(byteIndex)])
                        let green = CGFloat(rawData[Int(byteIndex+1)])
                        let blue = CGFloat(rawData[Int(byteIndex + 2)])
    
                        var h: CGFloat = 0.0
                        var s: CGFloat = 0.0
                        var b: CGFloat = 0.0
                        var a: CGFloat = 0.0
    
                        var c = UIColor(red:red, green:green, blue:blue, alpha:1.0)
                        c.getHue(&h, saturation: &s, brightness: &b, alpha: &a)
    
                        b = b/255.0
    
                        if Double(b) > 0.0 {
                            colorPixelFound = true
                        }
                        x+=1
                    }
                    x=0
                    y+=1
                }
    
            return colorPixelFound
    }
    

提交回复
热议问题