iPhone按钮非矩形形状?

pow*_*tac 5 iphone xcode button

如何获得非矩形按钮?

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

For*_*orm 8

就像其他人说你应该有一个合理的表面来注册触摸事件,但我相信你知道并且有你的理由所以我只会告诉你我是如何做到的:

我不久前需要这样做,而我所做的就是Sixten Otto刚刚提出的建议.我的原始问题("更新"部分)中有一些提示,用于在某个点获取图像的alpha值:

如何使用非矩形按钮创建透明窗口?

编辑:我建议在下面的例子中继承UIControl,但是如果除了它的"非矩形"之外你的按钮上不需要任何特殊的行为,那么只需用你的PNG创建无边框UIButton就能完成这项工作并要求减少工作量.通过对UIControl进行子类化并以"艰难的方式"进行操作,您可以更好地控制控件的行为.

我建议您继承UIControl并覆盖触摸事件方法,然后检查点击点下的alpha并且不处理事件if alpha == 0.对于绘图,您可以覆盖drawRect:并使用其中NSImagedrawInRect:fromRec:operation:fraction:方法在控件的框架中绘制图像.

首先,您需要加载图像并获取它的位图表示:

buttonImage = [NSImage imageNamed:@"myButtonImage"];
buttonImageRep = [[buttonImage representations] objectAtIndex:0];
Run Code Online (Sandbox Code Playgroud)

然后你可以将它绘制到控件的视图中:(其中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];
}
Run Code Online (Sandbox Code Playgroud)

此时,您已使用png图像绘制了按钮.如果alpha不为0,您可以覆盖触摸事件方法并处理事件:

NSColor *colorUnderMouse = [buttonImageRep colorAtX:mouse.x y:mouse.y];
float alpha = [colorUnderMouse alphaComponent];
Run Code Online (Sandbox Code Playgroud)

这就是我所做的,它运作得非常好.希望这可以帮助!

注意:我的例子是针对Mac的,但它也适用于iPhone,可能稍作修改.


Guv*_*nte 7

听起来您希望按钮的可点击区域与您正在使用的PNG完全匹配.

如果这就是你要找的东西,我会先说不要那样做.用手指按压iPhone,这通常不具有区分这么小区域的准确性.

但是,如果您坚持这个想法,那么解决方案是根本不使用按钮,而是处理父框架中的单击并手动解释单击的X/Y值以确定它是否在某个边界区域(In圆角边缘按钮的情况,可能包括检查4个圆圈和2个矩形的结果)

编辑:实现原始问题的一部分,我注意到你提到你想要根据Alpha通道自动处理这个功能.虽然我会推荐我的边界区域方法,但理论上你可以通过对PNG进行采样来测试Alpha通道,使其偏移按钮的原点.甚至可能在正常按钮的点击事件中执行此操作.