UIToolBar按钮部分显示iPhone 6的屏幕

时间:2014-09-30 22:43:58

标签: ios uitoolbar iphone-6 iphone-6-plus

我有一个UIView,其中包含一个UIToolBar,其中包含两个UIButtons和一个Flexible空间。对于iPhone 6和6Plus上的一些奇怪的原因而不是任何其他型号的iPhone,UIToolBar中的左右UIButton似乎显示屏幕的一半和一半。

以下是我对iPhone 6 / 6Plus的问题的一个示例

enter image description here

以下是它在其他所有设备上的显示方式

enter image description here

这是我用来创建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;
}

3 个答案:

答案 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];
}