2013-07-11 11 views
10

Ja eksperymentuje z iOS SDK i mam następujący UIView strukturę:Moving maskę CALayer w sprawie przewijania w Scrollview

  • UIView
    • UIImageView - tylko obraz tła
    • UIImageView (z CALayer maska)
    • UIScrollView
      • Label

bardzo prosta konstrukcja, UIScrollView jest przezroczysta warstwa i druga UIImageView ma maskę na nim. Próbuję to zrobić, aby maska ​​zmieniła położenie zgodnie z położeniem Treści w widoku przewijania. Jeśli użytkownik przewija, pozycja maski powinna zostać zaktualizowana. I już rozwiązał ten problem za pomocą UIScrollView „s Delegat:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView 
{ 
    CGPoint contentOffset = scrollView.contentOffset; 
    contentOffset.y = -contentOffset.y; 

    self.overlayImageView.viewlayer.mask.position = contentOffset; 
} 

Maska jest tworzony w viewDidLoad i nie zmienia się w trakcie cyklu widzenia sterownika.

Problem polega na tym, że aktualizacja pozycji maski jest zbyt wolna. W ten sposób wygląda na to, że maska ​​podąża za zawartością przewijania, nie przewijając jej. Metoda delegata scrollViewDidScroll jest wywoływana poprawnie.

Aby lepiej zrozumieć problem, dołączam wideo wykonane w symulatorze iOS. http://www.youtube.com/watch?v=w3xRl3LTngY

Więc pytanie brzmi:

Czy istnieje sposób, aby maski aktualizacji szybciej lub jest to limit iOS?

Odpowiedz

16

CALayer są niejawne animowany dla niektórych właściwości, takich jak położenie spróbować je wyłączyć:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView 
{ 

[CATransaction begin]; 
    [CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions]; 
CGPoint contentOffset = scrollView.contentOffset; 
contentOffset.y = -contentOffset.y; 

self.overlayImageView.viewlayer.mask.position = contentOffset; 
[CATransaction commit]; 

} 
+1

Wielki, rozwiązuje ten problem. Dziękuję Ci bardzo. Zmiany pozycji maski są teraz bardziej płynne. – Legoless