2016-03-30 22 views
0

Gezinme çubuğuma iki etiket ekledim ve kaydırma görünümündeki y konumundan yola çıkarak bir tanesini solmaya ve bir daha da sönmeye çalışıyorum. Alfa değerini kaydettiğimde, değerler doğru gibi görünüyor. Ama koştuğunuz zaman göründüğü gibi değil. TopTitleLable öğesinin alfaı 1'den neredeyse 0'a gider ve sonra yavaş yavaş kaybolur. Bunu nasıl ayıklayacağınızdan emin değilsiniz.Scrollview delegesinden alfa atama

dışarı solma gerekirken bu solma etiketle aşağıya doğru kaydırma resimdir:

enter image description here

TLDR: nasıl scrollview pozisyon kapalı dayalı bir etiket alfa değiştirebilirim?

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

cevap

1

Sana işlevsel almak için çalışıyoruz tam olarak ne anlamıyorum, ama ofset bir kaydırma dayalı sürekli değişiklik yapma bazen yanıltıcı olabileceğini biliyorum.

Genelde benim için problemi çözen şey, y-ofsetini bazı gerçek sayı çıkışlarına eşleyen bir işlevi yazmam gerektiğini (ve test etmem gerektiğini) fark etmektir. Bu

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

Bu böyle bir durum için iyi bir rehber sunuyor ...

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

önce hepimiz kaydırma bulaşmak .... Bu fonksiyonun grafiğini çizmek için genellikle yararlı olur görünümleri,

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

çıkışı üzerinden oku ... küçük bir test gibi yazmak ve beklediğiniz şekilde davranır emin olun.

Gerçek düzlem mantığını dışa vurmanın güzel bir yan etkisi, önceden test edilmiş işlevlerin bileşimlerini kullanabilmenizdir. Örneğin, yine de ...

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

başka bazı olumlu yan etkileri temsilci yönteminde artık alabilirsiniz basit netlik olduğunu ... belki gibi bir şey gerekir, tam fonksiyonel hedefini tahmin

- (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 Wow Çok teşekkür ederim! İki etiket için farklı bir yöntem kullanarak sona erdim, böylece farklı y değerlerinde içeri girip çıktım ancak grafik çok yardımcı oldu. – kiaraRobles