Кнопки UIToolBar, отображающие частично отключенный экран для iPhone 6

У меня есть UIView, который содержит UIToolBar с двумя кнопками UIB и гибкое пространство между ними. По какой-то странной причине на iPhone 6 и 6Plus, но не на любой другой модели iPhone, левая и правая UIButton в UIToolBar, кажется, отображают наполовину на половине экрана.

Вот пример проблемы, которую я имею для iPhone 6 / 6Plus

И вот как это выглядит на каждом другом устройстве I

Вот код, который я использую для создания UIToolBar, кнопок и метки.

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 ответа

Решение

Хорошо, так что мне еще предстоит найти причину этого, чтобы это произошло только на iPhone 6 и 6plus. Однако я придумала решение для себя, которое эффективно помещает отступ перед левой кнопкой и правой кнопкой.

У меня есть класс, который возвращает платформу устройства, а затем использовать его, чтобы проверить, нужно ли мне вставлять эти кнопки 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];
}

Вы можете принудительно настроить макет панели инструментов в методе viewDidAppear вашего viewController. Мне не нравятся такие обходные пути, но, похоже, это решает проблему, с которой я столкнулся правильно.

- (void) viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    [self.toolbar layoutSubviews];
}

Между прочим, кажется, что вы используете панель инструментов, где навигационная панель (от контроллера навигации) должна быть более подходящей.


РЕДАКТИРОВАТЬ: это исправить в viewDidAppear происходило немного слишком поздно, в результате чего изменение было видно пользователю при запуске приложения.

Это может быть не приспособлено в вашей ситуации, но, в свою очередь, я в итоге позвонил [self.toolbar setNeedsLayout] в самом конце моего application didFinishLaunchingWithOptionsmethod (что еще страшнее, но, кажется, работает)

Как объясняется в этой теме, лучше всего подклассифицировать 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];
Другие вопросы по тегам