【发布时间】:2010-12-06 09:41:31
【问题描述】:
如何获得非矩形按钮?
例如,我确实有一个具有 alpha 透明度的 PNG 图像。 如何在没有透明颜色的情况下将按钮的形状设置为此图像。
【问题讨论】:
-
更多关于你想要达到的目标的详细信息可能会让你更快地到达你想去的地方。
如何获得非矩形按钮?
例如,我确实有一个具有 alpha 透明度的 PNG 图像。 如何在没有透明颜色的情况下将按钮的形状设置为此图像。
【问题讨论】:
就像其他人说的那样,你应该有一个合理的表面来注册触摸事件,但我相信你知道这一点并且有你的理由,所以我将告诉你我是如何做到的:
不久前我需要这样做,而我所做的是 Sixten Otto 刚刚建议的。在我的原始问题(“更新”部分)中有一些提示,用于在某个点获取图像的 alpha 值:
How to create a transparent window with non-rectangular buttons?
编辑:我建议在下面的示例中子类化 UIControl,但如果您的按钮除了“非矩形”之外不需要任何特殊行为,那么只需子类化一个无边框 UIButton 集使用您的 PNG 将完成这项工作,并且需要更少的工作。通过继承 UIControl 并以“硬方式”进行操作,您可以更好地控制控件的行为。
我建议您继承UIControl 并覆盖触摸事件方法,然后检查点击点下的alpha,如果alpha == 0 则不处理该事件。对于绘图,您覆盖drawRect: 并使用NSImage 的drawInRect:fromRec:operation:fraction: 方法在控件的框架中绘制图像。
首先您需要加载图像并获得它的位图表示:
buttonImage = [NSImage imageNamed:@"myButtonImage"];
buttonImageRep = [[buttonImage representations] objectAtIndex:0];
然后您可以将其绘制到控件的视图中:(其中 stateImage 是指向必须绘制的图像的指针,具体取决于是否按下按钮)
- (void)drawRect:(NSRect)aRect {
[stateImage drawInRect:[self bounds] fromRect:NSMakeRect(0.0,0.0,[buttonImage size].width,[buttonImage size].height)
operation:NSCompositeSourceOver fraction:1.0];
}
此时,您已经使用 png 图像绘制了按钮。如果 alpha 不为 0,您可以覆盖触摸事件方法并处理该事件:
NSColor *colorUnderMouse = [buttonImageRep colorAtX:mouse.x y:mouse.y];
float alpha = [colorUnderMouse alphaComponent];
我就是这么做的,而且效果很好。希望这会有所帮助!
注意:我的示例适用于 Mac,但它也应该适用于 iPhone,可能需要稍作修改。
【讨论】:
听起来您希望按钮的可点击区域与您使用的 PNG 完全匹配。
如果那是您正在寻找的东西,我首先会说不要那样做。 iPhone是用手指按压的,一般不具备区分这么小区域的准确度。
但是,如果您坚持这个想法,那么解决方案是根本不使用按钮,而是处理父框架中的点击并手动解释点击的 X/Y 值以确定它是否在某个边界内区域(在圆边按钮的情况下,可能包括检查 4 个圆形和 2 个矩形的结果)
编辑: 意识到您最初的问题的一部分,我注意到您提到您希望根据 Alpha 通道自动处理该功能。虽然我会推荐我的边界区域方法,但理论上您可以通过对 PNG 进行采样以测试 Alpha 通道的值偏移按钮原点的值来实现这一点。甚至可能在普通按钮的单击事件中执行此操作。
【讨论】:
矩形按钮是一种按钮类型,您可以使用自定义按钮类型并分配图像以摆脱按钮的矩形边缘...这里引用按钮类型http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIButton_Class/UIButton/UIButton.html#//apple_ref/doc/c_ref/UIButtonType和UIButtonhttp://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIButton_Class/UIButton/UIButton.html
【讨论】:
作为Guvante says,依靠精确的触摸确实不是一个好主意。例如,Apple 建议 controls be at least 44px across。
我建议使用 UIButtonTypeCustom 类型的 UIButton,将按钮的图像设置为您的 PNG,并注册触摸事件 (see here for more on event handling)。然后,在您的操作方法中,您可以从事件中获取触摸的坐标,并根据图像的 alpha 测试这些坐标,看看您是否应该将其视为“真实”触摸。
【讨论】:
另一种选择是将按钮拆分为多个矩形部分。
【讨论】:
【讨论】: