2013-09-21 2 views
8

Я модернизировал свой проект с iOS 6 до iOS 7, но, похоже, проблема немного. Строка состояния и панель инструментов являются переопределяющими и очень близкими друг к другу. Панель инструментов была добавлена ​​ранее, вручную перетащив ее в раскадровку. Это как его показ:iOS 7 UIToolBar Overriding With Status Bar

toolbar

Я видел несколько вопросов, которые предполагающие использовать «positionForBar:» и «- (UIBarPosition) positionForBar: (ID) бар», но я не знаю, точно, как их использовать, небольшое объяснение и простой способ сделать это могут помочь. Благодаря!

UPDATE: Ниже приведен код, который также нуждается в исправлении. Он работал отлично раньше, но поскольку элемент управления detailview (WebViewController) теперь встроен в контроллер навигации, приведенный ниже код вызывает исключение. Похоже, мне нужно изменить первую строку в этом методе.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 

     WebViewController *wvc = [self.navigationController.parentViewController childViewControllers][1]; 
     RSSItem *entry = [[channel items] objectAtIndex:[indexPath row]]; 
     wvc.title = entry.title; 
     wvc.urlString = entry.link; 
} 

ответ

2

Если установка сплит вид, как установки с двумя видами контейнеров, вы должны быть в состоянии сделать это. Когда вы настраиваете представления контейнера, перетащите вверх, пока не увидите пунктирную синюю линию, указывающую, что верхняя часть находится в нижней части строки состояния. Сделайте это с обоими видами контейнера. Добавьте панель инструментов к встроенному контроллеру (а не к виду контейнера), прикрепленному к верхней части представления этого контроллера. С вид слева встраиваются в навигации контроллера, мой экран выглядит следующим образом:

enter image description here

+0

Могу ли я использовать панель навигации в контейнере подробного представления вместо панели инструментов. Как вы знаете, цвет, который мы предоставляем навигационной панели, применяется к строке состояния, а также в iOS 7, и это то, чего я пытаюсь достичь. – AJ112

+0

@ AJ112, конечно. Вы можете встроить этот контроллер в контроллер навигации или просто перетащить на панель навигации. – rdelmar

+0

Да, я могу либо использовать навигационную панель, либо встроить детальное представление в контроллер навигации. С панелью инструментов она отлично работала, я заменил панель инструментов навигационной панелью, перетаскиваемой в подробное представление. Он работает, но он сталкивается со строкой состояния так же, как панель инструментов. Если я перемещаю навигационную панель в подробном виде на 20 пунктов ниже вручную, все равно я не могу изменить цвет строки состояния, изменив цвет панели навигации. Оказывается, что перетаскиваемая вручную панель навигации не меняет цвет строки состояния. – AJ112

6
_toolBar.delegate = self; 

- (UIBarPosition)positionForBar:(id <UIBarPositioning>)bar { 
    CGRect frame = _toolBar.frame; 
    frame.origin = CGPointMake(0, [UIApplication sharedApplication].statusBarFrame.size.height); 
    _toolBar.frame = frame; 

    return UIBarPositionTopAttached; 
} 

portrait bar

landscape bar

+0

Что делать, если вид находится в контейнере внутри супер зрения. Что делать тогда? – AJ112

+0

Ваша панель инструментов находится внутри контейнера? – Luniz

+0

Панель инструментов находится в представлении, но этот вид внутри контейнера? Я использовал код в вашем ответе, но он не работал. Любая идея, что еще я должен изменить, чтобы она работала? – AJ112

3

Помните, что вы не должны просто переместить вещи вниз в IB по двум причинам:

  1. Не совместим с прошивкой 6
  2. не продлит верхний бар фонового эффекта под строкой состояния

What not to do...

Итак, если вы хотите iOS6 & совместимость с iOS7, вы можете добавить условное обозначение для объектов, которые требуют настройки в ViewDidLoad. Протест быть это последний сценарий - всегда пытаться исправить его с autolayout/IB первый:

#import <Availability.h> 

#ifdef __IPHONE_7_0 

     CGRect barFrame = topBar.frame; 
     barFrame.origin = CGPointMake(0, [UIApplication sharedApplication].statusBarFrame.size.height); 
     [topBar setFrame:barFrame]; 

     // move other stuff around too 

    #endif 

И установить бар делегат так же, как Luniz выше, переопределяют positionForBar к.

topBar.delegate = self; 

- (UIBarPosition)positionForBar:(id <UIBarPositioning>)bar { 

    return UIBarPositionTopAttached; 
} 
+0

Конечно, всю первую часть можно решить, просто установив флаг «Использовать полноэкранный (амортизированный)» (aka wantfulscreen) в IB. – capikaw

4

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

Вы можете сделать это, перемещая верхнее пространство вниз под строку состояния, а затем используя меню ограничений, чтобы добавить ограничение к ближайшему соседу, которое должно теперь быть верхним руководством по макете, или вы можете сделать это, как описано в this link on apple's developer library.

+1

Эта ссылка была действительно полезна для меня. Одна вещь, с которой мне пришлось бороться, заключалась в том, что XCode продолжал создавать новое ограничение вертикального расстояния, связывая нижнюю часть UIToolbar с руководством Top Layout Guide, требуя отрицательных значений, чтобы все выглядело правильно. Чтобы обмануть XCode, связав верхнюю часть UIToolbar с руководством Top Layout Guide, мне сначала пришлось перенести верхнюю часть его ниже направляющей, а затем создать ограничение. После этого я установил значение ограничения в ноль, которое соединило два вместе. –

1

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

Мое решение было сделать панель 64 точек в высоту и установить Topspace в надтаблицы 0.

При этом вы должны убедиться, что вы не создаете ограничение на Космическом Guide Top Layout. Я смог сделать это в Interface Builder, установив Frame равным 0,0 с высотой 64. Затем я использовал диалог Pin в меню плавающего инструмента. Я использовал ноль с верхним лучом I, чтобы создать ограничение.

Нижние края соответствуют Мастеру и деталям, а окраска согласована. Элементы управления на панели инструментов оказались непереполненными.

+0

Спасибо ... добавление 20 к высоте панели инструментов было единственным решением, которое я нашел, что не требовал Autolayout, для которого требуется iOS 6. У меня много пользователей iPad 1, поэтому я хочу поддерживать поддержку iOS 5 в мое приложение. – arlomedia

+0

Фактически, когда я увеличивал высоту панели инструментов, я обнаружил, что заголовок панели инструментов (UIBarItem) остался выровненным по нижнему краю, но кнопки панели инструментов (UIBarButtonItem) были вертикально центрированы - их позиция была слишком высокой. Единственный способ, которым я мог найти, чтобы отрегулировать позицию, - это настроить кнопку панели инструментов как UIButton, установленную как customView UIBarButtonItem, а затем настроить кадр UIButton. Если вам нужно применить tintColor панели инструментов к значку кнопки, тогда вам нужно использовать UIImageView вместо UIButton. – arlomedia

-1

Swift 3

Подключите бар делегата и соответствуют UIToolbarDelegate. Затем добавьте этот метод делегата:

func position(for bar: UIBarPositioning) -> UIBarPosition { 
    return UIBarPosition.topAttached 
} 

, потому что теперь

enum UIBarPosition : Int { 
    case any 
    case bottom 
    case top 
    case topAttached 
}