代码之家  ›  专栏  ›  技术社区  ›  powtac

非矩形iPhone按钮?

  •  5
  • powtac  · 技术社区  · 15 年前

    我怎样才能得到一个非矩形的按钮?

    例如,我有一个具有alpha透明度的PNG图像。 如果没有透明色,如何将按钮的形状设置为此图像。

    6 回复  |  直到 8 年前
        1
  •  8
  •   Community CDub    7 年前

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

    我不久前就需要这么做,我所做的就是SixtenOtto所建议的。在我最初的问题(“更新”部分)中,有一些提示可以在某个点获取图像的alpha值:

    How to create a transparent window with non-rectangular buttons?

    编辑: 我建议在下面的示例中对uicontrol进行子类化,但是如果除了按钮的“非矩形”之外,您不需要对按钮进行任何特殊的操作,那么只需使用PNG对无边界uibutton进行子类化即可完成此任务,并且所需的工作更少。通过对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,则可以重写touch事件方法并处理事件:

    NSColor *colorUnderMouse = [buttonImageRep colorAtX:mouse.x y:mouse.y];
    float alpha = [colorUnderMouse alphaComponent];
    

    我就是这么做的,而且效果很好。希望这有帮助!

    N.B:我的例子是在Mac上,但它也应该在iPhone上运行,可能稍作修改。

        2
  •  7
  •   Guvante    15 年前

    听起来您希望按钮的可单击区域与您使用的PNG完全匹配。

    如果这就是你要找的,我首先会说不要这样做。iPhone是用手指按压的,一般来说,手指无法准确区分如此小的区域。

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

    编辑: 意识到您最初的问题的一部分,我注意到您提到您想要基于alpha通道自动处理函数。虽然我会推荐我的边界区域方法,但理论上可以通过对png进行采样来测试alpha通道,该通道的值由按钮的原点偏移。甚至可以在普通按钮的单击事件中执行此操作。

        3
  •  5
  •   Daniel    15 年前
        4
  •  2
  •   Community CDub    7 年前

    AS Guvante says ,依靠精确的触摸确实不是一个好主意。例如,苹果公司建议 controls be at least 44px across .

    我建议使用 UIButton 类型的 UIButtonTypeCustom ,将按钮的图像设置为PNG,并注册触摸事件( see here for more on event handling )然后,在您的操作方法中,您可以从事件中获取触摸的坐标,并根据图像的alpha测试这些坐标,以查看是否应将其视为“真实”触摸。

        5
  •  1
  •   ianh    15 年前

    另一种选择是将按钮拆分为多个矩形部分。

        6
  •  1
  •   Andrew Romanov    8 年前

    @窗体右键关于使用“drawrect”实现按钮的自定义形状。

    但更好 method 检查触摸内部或非内部按钮使用

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

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

    如果不能为按钮使用自定义图像(例如,如果在按钮上绘制文本),则可以使用新的 method 要将子视图层次绘制到图像中,请执行以下操作:

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