Удалить волосок UIToolbar в iOS 7

В iOS 7 Apple изменила UIToolbar так, чтобы в верхней части отображалась линия роста в 1 пиксель. Это визуально отвлекает в некоторых случаях, и, кажется, нет никакого публичного API для его удаления.

Установка shadowImage не работает.

Я ищу способ удаления линии роста волос относительно чистым способом и сохранить обычный размытый фон.

29
задан 15.04.2020, 18:15

10 ответов

Если вы установите youBar.clipsToBounds = YES, линия волос исчезнет.

Надеюсь, что это поможет.

[РЕДАКТИРОВАТЬ]

Для нижней линии навигации навигационного бара решение здесь https://stackoverflow.com/a/18180330/2011578 также отлично работает.

83
ответ дан 15.04.2020, 18:16
  • 1
    Ваш последний snippet' s " return" строка содержит избыточный ") " символ. Так или иначе, спасибо, отличное решение! – gyorgyabraham 17.08.2013, 05:32
  • 2
    отличное решение. спасибо – kevinl 15.04.2020, 18:16
  • 3
    А-ч, хорошая идея. Я также заметил, что теневое изображение ниже военно-морской панели – Thyraz 15.04.2020, 18:16
  • 4
    только Ваше решение работало на меня! – Allen 15.04.2020, 18:17
  • 5
    Это должно быть выбрано как корректный ответ. Это работало на меня также. – C0D3 15.04.2020, 18:17

Граница волосяного покрова - это подвид UIImageView панели инструментов, его можно скрыть так:

        for (UIView *subView in [self.toolbar subviews]) {
            if ([subView isKindOfClass:[UIImageView class]]) {
                // Hide the hairline border
                subView.hidden = YES;
            }
        }
5
ответ дан 15.04.2020, 18:16
  • 1
    Спасибо за Ваш ответ. Ваше предложение с более общим подходом хорошо. Но острота является неловкой с точки зрения удобочитаемости. – michael.kebe 28.10.2009, 22:27

Линия - это shadowImage. Его можно просто удалить, применив пустой UIImage. В соответствии с документацией, вы также должны установить пользовательское фоновое изображение :

- (void)viewDidLoad {
  [self.navigationController.navigationBar setBackgroundImage:[[UIImage alloc]init] forBarMetrics:UIBarMetricsDefault];
  self.navigationController.navigationBar.shadowImage = [[UIImage alloc ]init];
}

. Имейте в виду: прозрачность не будет работать, если вы установите собственные изображения, если вам это нужно.

5
ответ дан 15.04.2020, 18:17
  • 1
    @michaelkebe, который Вы попросили остроты, я просто, обеспечил тот...;-) – fvu 28.10.2009, 22:39
  • 2
    Я думаю, что должен разъяснить свой вопрос тогда. Я должен удалить линию наименьшей толщины, но сохранить размытость (так никакая установка фонового изображения). – fzwo 15.04.2020, 18:18
  • 3
    Это раньше работало в iOS 6, но в iOS 7, устанавливание теневого изображения к прозрачному изображению не будет работать — существует очень слабая, яркая метка, где тень оттянута. – tinrocket 15.04.2020, 18:18

Несмотря на то, что он несколько хакерский, создающий подклассы UITabBar и переопределяющий метод - (void)addSubview:, мы можем предотвратить добавление разделителя линий роста в иерархию представлений:

- (void)addSubview:(UIView *)view {
    if ([view isKindOfClass:[UIImageView class]] && view.bounds.size.height < 2.0f) {
        return;
    }
    [super addSubview:view]; 
}

Таким образом, мы получим оба размытую панель вкладок и удалите разделитель волосяного покрова. Это также гарантирует, что UITabBar не будет обрезать изображения до границ, что важно для таких эффектов, как большие центральные кнопки или другие компоненты пользовательского интерфейса.

1
ответ дан 15.04.2020, 18:18
  • 1
    Возможно, я неправильно понимаю, но: " После этого следующие 2 значения будут больше (или равными), чем 1-е, и следующие 4 после этого будут больше, чем первые 3, тогда следующие 8 больше и т.д. " †“как контрпример: [1, 5, 9, 7, 15, 10, 11] допустимая двоичная минимальная "куча", но например, 7 (третий уровень в иерархии) еще меньше, чем 9 (второй уровень в иерархии). Заказанное свойство в "куче" только верно для parent†“дочерний обход, не обязательно для " aunt†“niece" отношения. – Daniel Andersson 23.08.2015, 21:50

Я не мог заставить это работать через раскадровку в моем случае. В конце концов я использовал прокси внешнего вида для устранения тени на всех моих панелях инструментов:

[[UIToolbar appearance] setClipsToBounds:YES];

0
ответ дан 15.04.2020, 18:18
  • 1
    @DanielAndersson: да, то предложение было упрощено и посредством упрощения, теперь в основном неправильно. Спасибо за указание на это! – Martijn Pieters♦ 23.08.2015, 22:30

Если вам нужно скрыть линию волос и показать теневые клипы, ограничения не помогают

используйте:

TOOLBAR.subviews
      .filter { [110] is UIImageView }
      .forEach { [110].hidden = true }

или:

for case let imageView is UIImageView in TOOLBAR.subviews {
    imageView.hidden = true 
}
0
ответ дан 15.04.2020, 18:19
  • 1
    Я думаю, что Ваше использование не является настолько надлежащим, пирамидальная сортировка (диапазон (100, 0,-1)), результат похож 100, 1, 2, 3... 98, 99. Для фиксации его попробуйте к heapify, одно время прежде u действительно выталкивает объекты: def heapsort(heap): heapq.heapify(heap) return [heapq.heappop(heap) for _ in range(len(heap))] – Menglong Li 02.03.2017, 14:45

это решение сработало для меня ... попробовал это для iOS 7

[self.navigationController.navigationBar setShadowImage:[UIImage new]];
1
ответ дан 15.04.2020, 18:19

Не совсем то, что вы хотите, но этот ответ наверняка кому-то поможет.

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

Для изменения нижней границы UINavigationBar (тень)

[self.navigationController.navigationBar setBackgroundImage: [UIImage imageNamed: @ "yourImageName"] forBarMetrics: UIBarMetricsDefault] ; [self.navigationController.navigationBar setShadowImage: [UIImage imageNamed: @ "yourImageName"]];

Для изменения нижней границы UIToolbar (тень)

[yourToolBar setBackgroundImage: [UIImage imageNamed: @ "yourImageName"] forToolbarPosition: UIBarPositionBottom barMetrics: UIBarMetricsDefault];

[yourToolBar setShadowImage: [UIImage imageBoTB] для_узла_позиции]: Местоположение: имя_узла: @ "МестоПоложение:" 118]

1
ответ дан 15.04.2020, 18:20
  • 1
    Да при использовании java 8 или вперед версии или Jodatime это не для Вас. Я сказал это, но я не был ясен. Спасибо за комментарий. – Breton F. 08.12.2018, 03:26

Это может быть легко решено на раскадровке:

Выберите представление, которое добавляется как UIBarButtonItem Container & amp; установить его "Clip Subviews" & amp; Запустите приложение.

enter image description here

2
ответ дан 15.04.2020, 18:20

При использовании раскадровок

self.clipsToBounds = true

можно настроить для панели инструментов в атрибутах времени выполнения. Это скроет линию волос. Проверено в iOS 7 и 8.

4
ответ дан 15.04.2020, 18:21
  • 1
    @michael.kebe я обычно помещаю новые строки с ternaries в "? " и ":" формат хита в Eclipse и это располагает вполне прилично. – gyorgyabraham 17.08.2013, 05:51

Теги

Похожие вопросы