очистить цветной фон навигационной панели, но по-прежнему плавать над всем содержимым

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

когда я пытаюсь это сделать, я настраиваю фон панели навигации как прозрачный, как это

   [self.navigationController.navigationBar setBackgroundImage:[self imageWithColor:[UIColor clearColor]] forBarMetrics:UIBarMetricsDefault];

но мой вид прокрутки будет полностью виден, когда он идет под навигационной панелью. Мне это не нравится, кто-нибудь знает, как сделать навигационную панель прозрачной, но все еще плавающей на всем?

Спасибо, ребята, за репутацию, вот снимок экрана от Yahoo weather их nav bar делает именно то, что я хочу.

enter image description here

но когда я устанавливаю для него четкий фон, он становится таким.

enter image description here

1 ответов


Я не на 100% уверен, как Yahoo это сделал, но я могу подделать этот эффект, как это

enter image description here

я вдохновлен BTGlassScrollView (https://github.com/BTLibrary/BTGlassScrollView) подход, который я использую, имеет несколько шагов:

1.> настройте навигационный контроллер следующим образом:

  • сначала поместите фоновое изображение
  • затем добавьте представление оболочки для представления прокрутки и установите фон представления обертки как прозрачный (это представление обертки очень важно, мы должны подделать эффект на этом представлении обертки)
  • перетащите вид прокрутки в вид обертки и установите фон Вида прокрутки как прозрачный.

enter image description here

2.> настройте все розетки для просмотра прокрутки, просмотра обертки и просмотра фонового изображения

3.> Вы также можете скрыть теневое изображение панели навигации, вот код, на всякий случай, если вам это нужно

    self.navigationController.navigationBar.shadowImage = [[UIImage alloc] init];

4. Тогда добавьте этот метод в свой класс

- (CALayer *)createViewMaskWithSize:(CGSize)size startGradientAt:(CGFloat)start endGradientAt:(CGFloat)end
{
    CAGradientLayer *mask = [CAGradientLayer layer];
    mask.anchorPoint = CGPointZero;
    mask.startPoint = CGPointMake(0.5f, 0.0f);
    mask.endPoint = CGPointMake(0.5f, 1.0f);
mask.colors = @[(id)[UIColor clearColor].CGColor, (id)[UIColor clearColor].CGColor, (id)[UIColor whiteColor].CGColor, (id)[UIColor whiteColor].CGColor];
    mask.locations = @[@0.0, @(start/size.height), @(end/size.height), @1.0f];
    mask.frame = CGRectMake(0, 0, size.width, size.height);

    return mask;
}

целью этого метода является создание слоя маски с градиентом от чистого до белого.

5.> последний шаг, просто добавьте это в свой wrapperView.слой.маска Такая

    // 64 in here is the position where the fade effect should start, and 80 is where the gradien should end
    // you can change those 2 numbers and see different effects
    self.scrollViewWrapperView.layer.mask = [self createViewMaskWithSize:self.scrollViewWrapperView.frame.size startGradientAt:64 endGradientAt:80];

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

Это очень грубые макеты, но надеюсь, что это даст вам некоторые идеи.