如何获得非矩形按钮?
例如,我确实有一个带有Alpha透明度的PNG图像。 如何在没有透明色的情况下将按钮的形状设置为此图像。
答案 0 :(得分:8)
就像其他人说你应该有一个合理的表面来注册触摸事件,但我相信你知道并且有你的理由所以我只会告诉你我是如何做到的:
我不久前需要这样做,而我所做的就是Sixten Otto刚刚提出的建议。我的原始问题(“更新”部分)中有一些提示,用于在某个点获取图像的alpha值:
How to create a transparent window with non-rectangular buttons?
编辑:我建议在下面的示例中对UIControl进行子类化,但如果您的按钮上除了“非矩形”之外不需要任何特殊行为,那么只需子类化无边框UIButton集使用PNG将完成工作并减少工作量。你可以通过继承UIControl来控制控件的行为,并以“艰难的方式”进行操作。
我建议你继承UIControl
并覆盖触摸事件方法,然后在点击点下检查alpha,如果alpha == 0
则不处理事件。对于绘图,您可以覆盖drawRect:
并使用NSImage
的{{1}}方法在控件的框架中绘制图像。
首先,您需要加载图像并获取它的位图表示:
drawInRect:fromRec:operation:fraction:
然后你可以将它绘制到控件的视图中:(其中stateImage是指向必须绘制的图像的指针,具体取决于是否按下按钮)
buttonImage = [NSImage imageNamed:@"myButtonImage"];
buttonImageRep = [[buttonImage representations] objectAtIndex:0];
此时您已使用png图像绘制了按钮。如果alpha不是0,您可以覆盖触摸事件方法并处理事件:
- (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];
}
这就是我所做的,而且效果非常好。希望这有帮助!
N.B:我的例子是针对Mac的,但它也可以在iPhone上运行,也许稍作修改。
答案 1 :(得分:7)
听起来您希望按钮的可点击区域与您正在使用的PNG完全匹配。
如果这就是你要找的东西,我会先说不要那样做。使用手指按下iPhone,这通常无法区分这么小的区域。
但是,如果您坚持这个想法,那么解决方案是根本不使用按钮,而是处理父框架中的单击并手动解释单击的X / Y值以确定它是否处于某个边界区域(在圆形边缘按钮的情况下,可能包括检查4个圆圈和2个矩形的结果)
编辑: 实现原始问题的一部分,我注意到你提到你想要根据Alpha通道自动处理这个功能。虽然我会推荐我的边界区域方法,但理论上你可以通过对PNG进行采样来测试Alpha通道,使其偏移按钮的原点。甚至可以在普通按钮的点击事件中执行此操作。
答案 2 :(得分:5)
矩形按钮是一种按钮类型,您可以使用自定义按钮类型并指定图像以消除按钮的矩形边缘...继承人对按钮类型http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIButton_Class/UIButton/UIButton.html#//apple_ref/doc/c_ref/UIButtonType和UIButton {{的引用3}}
答案 3 :(得分:2)
作为Guvante says,依靠精确触摸真的不是一个好主意。例如,Apple推荐controls be at least 44px across。
我建议使用UIButton
类型UIButtonTypeCustom
,将按钮的图像设置为PNG,然后注册触摸事件(see here for more on event handling)。然后,在您的操作方法中,您可以从事件中获取触摸的坐标,并根据图像的alpha测试这些坐标,以确定是否应将其视为“真实”触摸。
答案 4 :(得分:1)
另一种选择可能是将按钮分成多个矩形部分。
答案 5 :(得分:1)