UIButton setImage 不适用于自定义注释视图

Posted

技术标签:

【中文标题】UIButton setImage 不适用于自定义注释视图【英文标题】:UIButton setImage not working on custom annotation view 【发布时间】:2015-08-03 22:07:33 【问题描述】:

正如标题所说,我在使用 UIButton 类的 setImage 方法时遇到了问题。

在我的代码中,我成功地设置了自定义注释和自定义注释视图,并且我正在尝试向这些标注添加两个按钮。我可以在右侧的圆圈中添加小“i”,但在左侧我想要一个带有图像的按钮出现的地方什么也没有。

这是我在 mapView 的 viewForAnnotation 方法中的代码,其中“pin”是我的自定义注释视图,它是使用 mapView 的 dequeueReusableAnnotationViewWithIdentifier 方法设置的,并投射到我的自定义视图中,然后测试它是否为 nil .

我相信图像的路径是正确的,因为当它与所写的不同时,我能够收到有关图像存在的错误消息。另一件事是,当我单击信息按钮或标注上的任意位置时,将调用 calloutAccessoryControlTapped 方法,如何修复标注上任意位置调用的方法以及如何区分方法中的两个按钮。

    if(!pin)
        pin = [[CustomAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier];
        UIButton *buttonInfo = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
        [buttonInfo addTarget:nil action:@selector(showDetails:) forControlEvents:UIControlEventTouchUpInside];

         UIButton *buttonCar = [UIButton buttonWithType:UIButtonTypeCustom];
        [buttonCar addTarget:nil action:nil forControlEvents:UIControlEventTouchUpInside];
        UIImage *image = [UIImage imageNamed:@"Images/car.png"];
        if (image) 
            [buttonCar setImage:[UIImage imageNamed:@"Images/car.png"] forState:UIControlStateNormal];

        
        else

            NSLog(@"Your image is nil");

        
        pin.canShowCallout = YES;
        pin.rightCalloutAccessoryView = buttonInfo;
        pin.leftCalloutAccessoryView = buttonCar;
    

【问题讨论】:

您可能应该“重构”您的解释以使其更具可读性。它会帮助人们帮助你:) 【参考方案1】:

这里的问题是您没有设置按钮的框架,这意味着它基本上是不可见的。

试试这样的:

    UIButton *buttonCar = [UIButton buttonWithType:UIButtonTypeCustom];
                        [buttonCar addTarget:nil action:nil forControlEvents:UIControlEventTouchUpInside];

    UIImage *image = [UIImage imageNamed:@"Images/car.png"];
    if (image) 
            [buttonCar setImage:[UIImage imageNamed:@"Images/car.png"] forState:UIControlStateNormal];

     else 
              NSLog(@"Your image is nil");                      
    

    buttonCar.frame = CGRectMake(0, 0, image.size.width, image.size.height);

编辑:如果这不起作用并且您的日志确实显示您的图像为零,请尝试以下步骤来解决您的问题:

通过在项目导航器中选择文件并打开右侧的文件检查器窗格,确保您的图像确实包含在您正在构建的目标中。您的目标旁边是否有复选标记? (假设您没有使用资产目录)

检查图像的拼写 - 如果您在设备上进行测试,大写/小写将是一个问题(模拟器更宽容)。此外,如果图像是捆绑包的一部分,则不需要图像的完整路径。即只使用[UIImage imageNamed:@"car.png"]

【讨论】:

我在设置图像之前和之后都试过了,但它仍然没有显示出来。另外,需要提到的是图像注册为 nil,所以我让 NSLog 打印出它的 nil,尽管取出 if 语句并设置图像和框架,但没有任何显示。 好的。这个确切的代码对我有用,唯一的变化是图像的路径。您是否尝试过设置按钮的背景颜色以查看按钮是否确实存在并且问题在于图像的路径?显然,这似乎是这种情况,因为您的图像显示为 nil。例如buttonCar.backgroundColor = [UIColor redColor]; 更改背景颜色似乎对我没有任何帮助。我有一个名为“Images.xcassets”的文件夹,我试图从中访问图像。我的知识似乎有点混乱。 bundle 是指所有 .h 和 .m 文件以及其他资产所需的文件夹吗?我能够通过转到文件然后将文件添加到我的项目中,通过images.xcassets和汽车图像集并在其中添加汽车的image.png来显示图像,但是剩下的文件导航器中的图像与我的所有编码文件一起列出。但如果我有吨? 好的,所以您正在使用资产目录(文件会自动收集到 Images.xcassets 文件夹中)。您是否检查了资产目录是否包含在您的目标中(再次通过在 Project Navigator 中选择您的 Images.xcassets 文件并确保在右侧的 File Inspector 窗格中检查了您的目标)。假设您在目录中的图像集称为“汽车”,您可以像这样以编程方式访问它(没有文件结尾):UIImage *image = [UIImage imageNamed:@"car"]; 当您将图像拖到资产目录中时,会自动创建一个图像集。 这可能有助于理解资产目录:developer.apple.com/library/ios/recipes/…guides.codepath.com/ios/Adding-Image-Assets

以上是关于UIButton setImage 不适用于自定义注释视图的主要内容,如果未能解决你的问题,请参考以下文章

UIButton 不适用于自定义 UITableViewCell (Swift)

PKAddPassButton 不适用于 iOS 9

自定义 UIView:未调用 UIButton addTarget

UIButton setTitleColor 和 setImage 不起作用

自定义 barbuttonItem 不显示

ios Custom UIButton scale setImage down不工作