30

我认为很聪明,只是在具有确切帧大小的 UIImageView 上放置一个透明的 UIButton,这样我就可以轻松地将它与我喜欢的任何事件(例如 TouchUpInside)连接起来,并使其在调用视图控制器的操作方法时用户触摸它。好吧,它一直有效,直到 alpha 低于 0.1f。如果我做 0.01f,它将不起作用。所以为了让它发挥作用,当你在屏幕上看很长时间时,你会看到 0.1f 的 alpha 透过。这太恶心了;)

似乎 iPhone OS 试图变得聪明,并且如果它在视觉上不存在,则不会捕获按钮上的事件。知道如何解决吗?

当然,我可以创建 UIImageView 的子类并实现 touchesBegan:... 等,但感觉并不优雅。我的意思是......当我想在网络上超链接一张图片时,我永远不想为该图片创建我自己的 HTML 元素,只是在点击它时将它连接到一个 url。这对我来说没有多大意义。

4

11 回答 11

46

您应该能够在 Interface Builder 中将按钮的“类型”设置为自定义,并且它不会在 UIImageView 上显示任何文本或图形元素。这样,您无需调整 alpha。如果视图是从代码构建的,请使用:

button = [UIButton buttonWithType:UIButtonTypeCustom];
于 2009-05-27T12:29:04.097 回答
3

最好的方法是:

myButton.hidden = YES;

您不能使用 buttonType 属性,因为它是只读属性。使用它的唯一方法是动态创建按钮。

于 2011-04-10T21:57:43.597 回答
3

除了 UIButtonTypeCustom,我将按钮文本颜色设置为以下:

[button setTitleColor:[UIColor clearColor] forState:UIControlStateNormal];
[button setTitleShadowColor:[UIColor clearColor] forState:UIControlStateNormal];
[button setTitleColor:[UIColor clearColor] forState:UIControlStateHighlighted];
[button setTitleShadowColor:[UIColor clearColor] forState:UIControlStateHighlighted];
于 2009-08-18T15:48:05.407 回答
2

您可以隐藏按钮(或任何对象)并通过向其图层添加蒙版来使其保持活动状态。该按钮将不可见,但仍会捕获事件。

let layer = CAShapeLayer()
layer.frame = .zero
myButton.layer.mask = layer
于 2017-11-08T09:15:43.963 回答
1

我也相信您可以将图像分配给按钮。

图像可以占据整个框架,如果设置正确,也可以没有其他纽扣伪像。

查看物业

UIButtonInstance.currentImage

这样,您就不会使用本质上已经存在的元素来占用您的资源。

于 2009-05-27T12:38:34.250 回答
0

这是我找到的唯一方法...

[yourButton setImage:[UIImage imageNamed:@"AnEmptyButtonWithTheSameSize.png"] forState:UIControlStateNormal];

照顾好形象。它必须是 .png

于 2012-09-04T07:16:10.183 回答
0

自定义 UIButton 响应用户交互,除非它们的 alpha 设置为 0。将自定义 UIButton 放在 imageView 顶部并连接到 buttonPressed 操作。我还为我的 UIView 设置了一个额外的高亮图像,现在它的行为就像一个 UIButton。首先,我定义了 UIView 保持突出显示的持续时间:

#define HIGHLIGHTED_DURATION 0.1 

然后在按下按钮时将图像视图设置为突出显示,并启动一个计时器以在该持续时间内使其保持突出显示。不要忘记为您的图像视图设置突出显示的图像。

- (IBAction)buttonPressed:(id)sender {

[_yourImageView setHighlighted:YES];
_timer = [NSTimer scheduledTimerWithTimeInterval:HIGHLIGHTED_DURATION
                                          target:self
                                        selector:@selector(removeHighlighted)
                                        userInfo:nil
                                         repeats:NO];
}

并且在计时器完成时简单地撤消突出显示:

-(void) removeHighlighted{
    _yourImageView.highlighted = NO;

}
于 2012-09-28T08:29:07.557 回答
0

Jasons 上面的回答几乎是正确的,但无法设置按钮类型。因此,要以编程方式创建一个空按钮,请使用以下代码:

UIButton* myButton = [UIButton buttonWithType:UIButtonTypeCustom];
myButton.frame=frame;
[self.view addSubview:myButton];
于 2011-04-10T22:12:41.423 回答
0

这就是我所做的,但使用 UIButton 的子类,后来我发现不应该根据网络对其进行子类化。我的子类被称为 Points

点数 *mypoint=[点数 buttonWithType:UIButtonTypeCustom];

然后,如果您有要添加到按钮的图像: [mypoint setImage:imageNamed:@"myimage"] forstate: UIControlStateNormal];

如果您不添加此图像,则该按钮将对用户不可见,但应响应触摸。这就是我在 imageView 上创建热点的方式,以便让它响应用户交互。

于 2012-05-03T00:05:52.273 回答
0

lazyImageView = [[UIImageView alloc] init];

                        button=[[UIButton alloc]init];
                        [UIButton buttonWithType:UIButtonTypeRoundedRect];
                        [button addTarget:self
                                   action:@selector(aMethodForVideo:)
                         forControlEvents:UIControlEventTouchUpInside];
                        [button setBackgroundImage:[UIImage    imageNamed:@"BackTransparent.png"] forState:UIControlStateHighlighted];
                        [button setTitle:@"" forState:UIControlStateNormal];

                                lazyImageView.frame=CGRectMake(x, y, w, h);
                                button.frame=CGRectMake(x, y, w, h);

设置按钮的框架和图像都具有相同的框架。我使用此代码并且工作正常。还为状态设置按钮背景图像:UIControlStateHighlighted 所以当你点击它时,你会看到点击效果。

于 2014-03-25T10:51:10.577 回答
0

我设法使用以下代码来做到这一点。如果 iPad 是横向的,该按钮将位于屏幕的右上角。

    UIButton *adminButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    adminButton.frame = CGRectMake(974.0f, 0.0f, 50.0f, 50.0f);
    [adminButton setBackgroundColor:[UIColor clearColor]];
    [adminButton setTag:1];
    [adminButton addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];

    [self.view addSubview:adminButton];

按下“adminButton”将运行以下函数:

- (void)buttonPressed:(id)sender  {

int buttonId = ((UIButton *)sender).tag;

  switch(buttonId) {
    case 1:
       NSLog (@"Admin button was pressed");
        break;
    case 2:
        //if there was a button with Tag 2 this will be called
        break;

    default:
        NSLog(@"Key pressed: %i", buttonId);
        break;
   }

}
于 2016-03-18T12:35:53.167 回答