UIBarButtonItem不再显示在iOS 11中

问题描述:

我刚更新我的设备到iOS来测试我的应用程序,准备iOS 11。我有一个工具栏在顶部,不再有按钮工作 - 图像在iOS 10中工作正常和下面。UIBarButtonItem不再显示在iOS 11中

下面是如何初始化图片:

@property (strong, nonatomic) IBOutlet UIToolbar *navBar; 
@property (strong, nonatomic) IBOutlet UIBarButtonItem *refreshButton; 

    path = [NSString stringWithFormat: @"https://s3.amazonaws.com/myapp/images/refresh.png"]; 
    url = [NSURL URLWithString:path]; 
    data = [NSData dataWithContentsOfURL:url]; 
    refreshButton = [[UIImage alloc] initWithData:data]; 

    smallerButton = [TRUtils imageWithImage:refreshButton scaledToSize:CGSizeMake(20, 20)]; 

    //TODO: Check image exists 
    self.refreshButton = [[UIBarButtonItem alloc] initWithImage:[smallerButton imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] 
                 style:UIBarButtonItemStylePlain 
                 target:self 
                 action: @selector(refreshButtonPushed:)]; 
    [self.refreshButton setTarget:self]; 
    self.refreshButton.enabled = YES; 
    self.refreshButton.imageInsets = UIEdgeInsetsMake(32, 32, 32, 32); 

然后,我将它们添加到导航栏的位置:

self.navBar.items = [NSArray arrayWithObjects:self.backButton, self.forwardButton, self.flex, self.toolbarTitle, self.flex, self.refreshButton, self.flex, self.homeButton, nil]; 

任何想法,为什么这些图像将停止显示iOS的11,但显示只是罚款iOS 10?

它看起来像按钮仍然“工作”,但他们只是空白,所以人们不知道他们可用。

看起来好像this SO有一个解决方案来解决它。但是,当我设置:

self.navigationController.interactivePopGestureRecognizer.delegate = self; 

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer { 
    if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)] && 
     gestureRecognizer == self.navigationController.interactivePopGestureRecognizer) { 
     return NO; 
    } 
    return YES; 
} 

的问题仍然存在。

您在UIBarButtonItem上设置的imageInsets是问题所在。摆脱它们,这应该让图标显示在iOS 11上。考虑到图像的大小和标签栏的正常大小,那里的值看起来似乎是假的。我的猜测是,iOS 10完全忽略了它们,但是iOS 11正在尝试做“正确的事情”。

以下是一些基本的操场我用来验证iOS上11的行为的内容:

import UIKit 
import PlaygroundSupport 

extension UIImage { 

    func scaledImage(withSize size: CGSize) -> UIImage { 
     UIGraphicsBeginImageContextWithOptions(size, false, 0.0) 
     defer { UIGraphicsEndImageContext() } 
     draw(in: CGRect(x: 0.0, y: 0.0, width: size.width, height: size.height)) 
     return UIGraphicsGetImageFromCurrentImageContext()! 
    }  
} 

let navbar = UIToolbar(frame: CGRect(origin: .zero, size: CGSize(width: 320, height: 40))) 

let imageUrl = URL(string: "http://www.freeiconspng.com/uploads/black-refresh-icon-png-9.png")! 
let imageData = try Data(contentsOf: imageUrl) 
let image = UIImage(data: imageData)!.withRenderingMode(.alwaysOriginal).scaledImage(withSize: CGSize(width: 20, height: 20)) 

let shareButton = UIBarButtonItem(barButtonSystemItem: .action, target: nil, action: nil) 
let refreshButton = UIBarButtonItem(image: image, style: .plain, target: nil, action: nil) 

// Uncomment the line below to reproduce the issue on iOS 11 
//refreshButton.imageInsets = UIEdgeInsets(top: 32, left: 32, bottom: 32, right: 32) 

navbar.items = [shareButton, refreshButton] 

PlaygroundPage.current.liveView = navbar