2016-03-30 1 views
0

ナビゲーションバーに2つのラベルを追加しました。スクロールビューのy位置に基づいて、1つずつフェードインしてフェードインしようとしています。アルファ値を記録すると、値が正しいかのように見えます。しかし、それはあなたがそれを実行するときに見える方法は正しくありません。 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); 
} 

我々は、すべてのスクロールとごちゃ混ぜビューのような小さなテストを書いてください。

出力を読み、期待どおりに動作することを確認してください。

リアルプレーンロジックを因数分解することの良い副作用は、すでにテスト済みの関数の合成を使用できることです。例えば、まだ...

- (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

@ダフありがとうございました!私は2つのラベルの異なるメソッドを使用して終わったので、異なるy値でフェードイン/フェードアウトするようになりましたが、グラフは非常に役立ちました。 – kiaraRobles

関連する問題