我有一个UIView,其中包含一个UIToolBar,其中包含两个UIButtons和一个Flexible空间。对于iPhone 6和6Plus上的一些奇怪的原因而不是任何其他型号的iPhone,UIToolBar中的左右UIButton似乎显示屏幕的一半和一半。
以下是我对iPhone 6 / 6Plus的问题的一个示例
以下是它在其他所有设备上的显示方式
这是我用来创建UIToolBar,Buttons和Label的代码。
UILabel *toolBarLabel = [[UILabel alloc] initWithFrame:CGRectMake((ScreenWidth - 150.0) / 2, 3.0, 150.0, 40.0)];
toolBarLabel.font = [UIFont boldSystemFontOfSize:16.0];
toolBarLabel.textColor = [UIColor whiteColor];
toolBarLabel.textAlignment = NSTextAlignmentCenter;
toolBarLabel.backgroundColor = [UIColor clearColor];
toolBarLabel.text = @"Calculator";
prefToolBar = [[UIToolbar alloc] init];
[prefToolBar setTranslucent:NO];
prefToolBar.clipsToBounds = YES;
[[UIToolbar appearance] setBarTintColor:[UIColor colorWithRed:colorController.oRed/255.0 green:colorController.oGreen/255.0 blue:colorController.oBlue/255.0 alpha:1.0]];
[prefToolBar addSubview:toolBarLabel];
// add buttons
// create an array for the buttons
NSMutableArray* BarbuttonsArray = [[NSMutableArray alloc] initWithCapacity:5];
// create a Cancel button
UIBarButtonItem * cancelButton = [[UIBarButtonItem alloc] initWithTitle:@"Close"
style:UIBarButtonItemStylePlain
target:self
action:@selector(closeUIButton)];
cancelButton.style = UIBarButtonItemStylePlain;
cancelButton.tintColor = [UIColor whiteColor];
[BarbuttonsArray addObject:cancelButton];
UIBarButtonItem *flexible = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
[BarbuttonsArray addObject:flexible];
// create a submitButton
saveButton = [[UIBarButtonItem alloc]initWithTitle:@"Search"
style:UIBarButtonItemStylePlain
target:self
action:@selector(submitButton)];
saveButton.style = UIBarButtonItemStylePlain;
saveButton.tintColor = [UIColor whiteColor];
[BarbuttonsArray addObject:saveButton];
// put the BarbuttonsArray in the toolbar and release them
[prefToolBar setItems:BarbuttonsArray animated:NO];
UIView *frameToolbar = [[UIView alloc] initWithFrame:CGRectMake(0.0, 44.0, ScreenWidth, 0.5)];
frameToolbar.backgroundColor = [UIColor lightGrayColor];
[prefToolBar addSubview:frameToolbar];
只需添加我用来返回屏幕宽度和高度的方法,以获取有关我正在做什么的更多信息。
@implementation calcScreenSize
+(CGFloat)screenWidth {
if(UIInterfaceOrientationIsPortrait([UIApplication sharedApplication].statusBarOrientation)){
return [UIScreen mainScreen].bounds.size.width;
}else
return [UIScreen mainScreen].bounds.size.height;
}
+(CGFloat)screenHeight {
if(UIInterfaceOrientationIsPortrait([UIApplication sharedApplication].statusBarOrientation)){
return [UIScreen mainScreen].bounds.size.height;
}else
return [UIScreen mainScreen].bounds.size.width;
}
答案 0 :(得分:1)
您可以在viewController的viewDidAppear方法中强制使用工具栏的布局。 我不太喜欢那种解决方法,但这似乎解决了我正确的类似问题。
- (void) viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
[self.toolbar layoutSubviews];
}
顺便说一句,您似乎正在使用工具栏,其中导航栏(uinavigationcontroller)应该更合适。
编辑:viewDidAppear
中的此修复程序发生得太晚了,导致应用程序启动时用户可以看到更改。
它可能不适合你的情况但是,在我的情况下,我最终在[self.toolbar setNeedsLayout]
的最后调用application didFinishLaunchingWithOptionsmethod
(这甚至更丑,但似乎有效)
答案 1 :(得分:0)
如this thread中所述,最好的办法是将UINavigationBar子类化。
作为替代方案,您可以使用UIButton代替。这是代码:
UIButton *close = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 30, 30)];
// close.frame = CGRectMake( 0, 0, 40, 30 );
[close setTitle:@"Close" forState:UIControlStateNormal];
[close addTarget:self action:@selector(close) forControlEvents:UIControlEventTouchUpInside];
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:close];
答案 2 :(得分:0)
好的,我还没有找到仅在iPhone 6和6plus上发生这种情况的原因。不过我已经为自己想出了一个解决方案,它有效地将填充放在左键前面和右键后面。
我有一个类tha返回设备的平台,然后用它来检查我是否需要插入这些UIBarButtonSystemItemFixedSpace按钮来填充可见按钮。
代码如下......这是我在经过几个小时的阅读和空手而来之后所做的最好的事情。我希望这可以帮助任何碰巧发现此错误的人。
platformCalculator = [[PlatformCalculator alloc] init];
NSString *currentPlatform = [platformCalculator platformNiceString];
if (([currentPlatform isEqual:@"IPHONE 6"]) || ([currentPlatform isEqual:@"IPHONE 6PLUS"])) {
UIBarButtonItem *positiveSeparator = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
positiveSeparator.width = 15;
[BarbuttonsArray addObject:positiveSeparator];
}
if (([currentPlatform isEqual:@"IPHONE 6"]) || ([currentPlatform isEqual:@"IPHONE 6PLUS"])) {
UIBarButtonItem *negativeSeparator = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
negativeSeparator.width = 15;
[BarbuttonsArray addObject:negativeSeparator];
}