iPhone按钮非矩形形状?

时间:2009-10-13 17:02:45

标签: iphone xcode button

如何获得非矩形按钮?

例如,我确实有一个带有Alpha透明度的PNG图像。 如何在没有透明色的情况下将按钮的形状设置为此图像。

6 个答案:

答案 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)

@Form关于使用' drawRect'为按钮实现自定义形状。

但更好method来检查内部按钮或不按内部按钮是

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event;

您可以为某些部分的触摸创建透明按钮。

如果您无法使用自定义图片作为按钮(例如,如果您在按钮上绘制文字),则可以使用新的method将子视图层次结构绘制到图像中:

 - (BOOL)drawViewHierarchyInRect:(CGRect)rect afterScreenUpdates:(BOOL)afterUpdates;