【问题标题】:iPhone button with non-rectangle shape?非矩形形状的 iPhone 按钮?
【发布时间】:2010-12-06 09:41:31
【问题描述】:

如何获得非矩形按钮?

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

【问题讨论】:

  • 更多关于你想要达到的目标的详细信息可能会让你更快地到达你想去的地方。

标签: iphone xcode button


【解决方案1】:

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

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

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

编辑:我建议在下面的示例中子类化 UIControl,但如果您的按钮除了“非矩形”之外不需要任何特殊行为,那么只需子类化一个无边框 UIButton 集使用您的 PNG 将完成这项工作,并且需要更少的工作。通过继承 UIControl 并以“硬方式”进行操作,您可以更好地控制控件的行为。

我建议您继承UIControl 并覆盖触摸事件方法,然后检查点击点下的alpha,如果alpha == 0 则不处理该事件。对于绘图,您覆盖drawRect: 并使用NSImagedrawInRect: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,可能需要稍作修改。

【讨论】:

    【解决方案2】:

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

    如果那是您正在寻找的东西,我首先会说不要那样做。 iPhone是用手指按压的,一般不具备区分这么小区域的准确度。

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

    编辑: 意识到您最初的问题的一部分,我注意到您提到您希望根据 Alpha 通道自动处理该功能。虽然我会推荐我的边界区域方法,但理论上您可以通过对 PNG 进行采样以测试 Alpha 通道的值偏移按钮原点的值来实现这一点。甚至可能在普通按钮的单击事件中执行此操作。

    【讨论】:

      【解决方案3】:

      【讨论】:

        【解决方案4】:

        作为Guvante says,依靠精确的触摸确实不是一个好主意。例如,Apple 建议 controls be at least 44px across

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

            @Form 关于使用'drawRect' 来实现按钮的自定义形状是正确的。

            但最好method 来检查是否触摸内部或不内部按钮正在使用

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

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

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2013-10-28
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-07-01
              • 2012-02-14
              • 1970-01-01
              相关资源
              最近更新 更多