ios - 如何知道是否在 Xcode 中触摸了 .png 的唯一可见区域

标签 ios objective-c swift uiimageview

我已经在 Xcode 中将一个 .png 图像导入到 UIImageView 中,我想要做的是当图像被触摸时,它将被隐藏。

但我的问题是 png 图像包含透明部分,当我触摸透明部分时, Action 继续进行。我希望只有当图像的可见部分被触摸时, Action 才会继续。如何解决问题?

Swift 或 Objective-C

最佳答案

我已经创建了一个自定义的 UIButton 子类,它的行为与您描述的完全一样,看看:https://github.com/spagosx/iOS-Shaped-Button-Swift

它是用 Swift 编写的,但很容易转换为 Objective-c。

方法是从触摸点获取像素数据并访问 RGBA 值,在本例中我们读取 A(alpha)并检查它是否高于我们的阈值。

看一段代码:

func alphaFromPoint(point: CGPoint) -> CGFloat {
    var pixel: [UInt8] = [0, 0, 0, 0]
    let colourSpace = CGColorSpaceCreateDeviceRGB()
    let alphaInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.premultipliedLast.rawValue)
    let context = CGContext(data: &pixel, width: 1, height: 1, bitsPerComponent: 8, bytesPerRow: 4, space: colourSpace, bitmapInfo: alphaInfo.rawValue)

    context?.translateBy(x: -point.x, y: -point.y)

    self.layer.render(in: context!)

    let floatAlpha = CGFloat(pixel[3])
    return floatAlpha
}

然后您可以获取 floatAlpha 值并将其与您可接受的 alpha 值进行比较:

    override func pointInside(point: CGPoint, withEvent event: UIEvent?) -> Bool {
        return self.alphaFromPoint(point) >= 100
    }

关于ios - 如何知道是否在 Xcode 中触摸了 .png 的唯一可见区域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27923232/

相关文章:

ios - 如何将实时照片上传到服务器?

objective-c - NSAutoreleasePool 自动释放池是如何工作的?

objective-c - -[UITableView setStyle:]在iOS 6中崩溃了(但在iOS 5.1中没有)

ios - 如何使用最后一个 CoreData 条目验证今天的日期

swift - 如何声明扩展特定父类(super class)并符合协议(protocol)的变量

ios - UIScrollView - 将 View 移到前面,但在滚动指示器下方

ios - 如何从 cellForRowAtIndexPath 获取 textField 上的边框线?

ios - 设备旋转时如何使 UIView 阴影拉伸(stretch)?

iphone - UIMenuController 自定义项

swift - 限制我的玩家在 x 方向移动太多