2016-03-30 2 views
0

Я добавил две метки в свою навигационную панель, и я пытаюсь потушить ее и потушить другую, основанную на позиции y на прокрутке. Когда я регистрирую альфа-значение, кажется, что значения верны. Но как это выглядит, когда вы запускаете это неправильно. Альфа topTitleLable идет от 1 до почти 0, а затем медленно исчезает, а не выходит. Не знаете, как отладить это.Назначение альфы из делегата scrollview

Это изображение вниз свиток с меткой замирания в том, когда она должна быть выведении:

enter image description here

tldr: Как вы измените альфа этикетки на основе от позиции Scrollview?

- (void)scrollViewDidScroll:(UIScrollView *)scrollView 
{ 
static CGFloat startFade = 190; 
static CGFloat endFade = 215; 
CGFloat difference = endFade - startFade; 

if (scrollView.contentOffset.y < startFade && self.navigationController.topTitleLabel.alpha != 1.0) { 
    self.navigationController.topTitleLabel.alpha = 1.0; 
    self.navigationController.bottomTitleLabel.alpha = 0.0; 
} else if (scrollView.contentOffset.y >= startFade && scrollView.contentOffset.y <= endFade) { 
    CGFloat scrollViewFraction = difference - (scrollView.contentOffset.y - startFade); 
    CGFloat topLabelAlpha = scrollViewFraction/difference; 
    CGFloat bottomLabelAlpha = 1 - topLabelAlpha; 
    self.navigationController.topTitleLabel.alpha = topLabelAlpha; 
    NSLog(@"%f VS. %f", topLabelAlpha, self.navigationController.topTitleLabel.alpha); 

    self.navigationController.topTitleLabel.alpha = bottomLabelAlpha; 
} else if (scrollView.contentOffset.y > endFade && self.navigationController.topTitleLabel.alpha != 0.0) { 
    self.navigationController.topTitleLabel.alpha = 0.0; 
    self.navigationController.bottomTitleLabel.alpha = 1.0; 
} 
} 

ответ

1

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

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

alpha | 
     | 
    1 |   /------ 
     |  /
     |  /
    0 |------/ 
     --------------------- y offset 
      | | 
      190 215 

Это обеспечивает хорошее руководство для чего-то вроде этого ...

- (CGFloat)bottomLabelAlphaAtY:(CGFloat)y { 
    if (y < 190) return 0; 
    if (y >= 215) return 1; 
    return (y-190)/(215-190); 
} 

Перед мы получаем все смешались с прокруткой просмотрите, напишите немного теста, например ...

- (void)testBottomLabelAlphaFunction { 
    for (int y=180; y<225; y+=0.5) { 
     NSLog(@"y=%.2f f(y)=%.3f", y, [self bottomLabelAlphaAtY:y]); 
    } 
} 

Прочитайте вывод и убедитесь, что он ведет себя так, как вы ожидаете.

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

- (CGFloat)topLabelAlphaAtY:(CGFloat)y { 
    return 1 - [self bottomLabelAlphaAtY:y]; 
} 

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

- (void)scrollViewDidScroll:(UIScrollView *)scrollView { 
    CGFloat y = scrollView.contentOffset.y 
    self.navigationController.topTitleLabel.alpha = [self topLabelAlphaAtY:y]; 
    self.navigationController.bottomTitleLabel.alpha = [self bottomLabelAlphaAtY:y]; 
} 
+0

@dahh Ничего себе, спасибо! Я закончил использовать другой метод для двух ярлыков, чтобы затухать и исчезать при разных значениях y, но график был чрезвычайно полезен. – kiaraRobles

Смежные вопросы