CAGradientLayer als layer.mask einer UIScrollview subclass: Mask scrollt mit dem Content mit. Wie verhindern?

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • CAGradientLayer als layer.mask einer UIScrollview subclass: Mask scrollt mit dem Content mit. Wie verhindern?

    Ich habe eine Scrollview subclass welche bei der iPad Variante der App in einem transparenten PopOver dargestellt wird.
    Beim Scrollen soll nun am oberen und unteren Ende der Content weich ausgeblendet werden (Apples Notes.app macht das z.B. auch so am unteren Ende).

    Funktioniert mit CAGradientLayer von white nach clearColor als scrollview.layer.mask auch wunderbar, nur leider scrollt die Maske mit statt einen weichen Fade-Out Effekt zu erzeugen.
    Irgendwelche Ideen wie man das verhindern könnte?

    Quellcode

    1. CAGradientLayer *mask = [CAGradientLayer layer];
    2. mask.locations = [NSArray arrayWithObjects:
    3. [NSNumber numberWithFloat:0.0],
    4. [NSNumber numberWithFloat:0.1],
    5. [NSNumber numberWithFloat:0.9],
    6. [NSNumber numberWithFloat:1.0],
    7. nil];
    8. mask.colors = [NSArray arrayWithObjects:
    9. (__bridge id)[UIColor clearColor].CGColor,
    10. (__bridge id)[UIColor whiteColor].CGColor,
    11. (__bridge id)[UIColor whiteColor].CGColor,
    12. (__bridge id)[UIColor clearColor].CGColor,
    13. nil];
    14. mask.frame = self.scrollview.bounds;
    15. // vertical direction
    16. mask.startPoint = CGPointMake(0, 0);
    17. mask.endPoint = CGPointMake(0, 1);
    18. self.scrollview.layer.mask = mask;
    Alles anzeigen
  • Ok,

    nach dem Post bin ich selbst drauf gekommen die frame property der Mask anzupassen. :P
    Folgender Code ist in der ScrollVIew Subclass:

    Quellcode

    1. -(void)layoutSubviews {
    2. [super layoutSubviews];
    3. CGRect layerMaskFrame = self.layer.mask.frame;
    4. layerMaskFrame.origin = [self convertPoint:self.bounds.origin toView:self];
    5. self.layer.mask.frame = layerMaskFrame;
    6. }


    Allerdings hinkt die Positionierung der Maske hinterher wenn man schnell scrollt.
    Also ob der die Maske animiert werden würde statt sofort bewegt.

    Wie kann sowas zustande kommen?
    layoutSubviews wird doch nicht innerhalb einer Animation aufgerufen und ich setzte direkt das Frame...
  • Und der 4te Post um das Thema zu beenden:
    Habe von einem befreundeten Dev den richtigen Hinweis erhalten.

    Quellcode

    1. [CATransaction begin];
    2. [CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions];
    3. // Set the frame
    4. [CATransaction commit];




    edit: und falls irgendwann jemand über so ein Problem stolpert und es ihm wie mir an Basiswissen über CATransactions fehlt noch etwas Hintergrundinfo aus der Doku warum ich da nun eine ungewollte Animation drin hatte:

    Core Animation supports two types of transactions: implicit transactions and explicit transactions. Implicit transactions are created automatically when the layer tree is modified by a thread without an active transaction and are committed automatically when the thread's run-loop next iterates. Explicit transactions occur when the the application sends the CATransaction class a begin message before modifying the layer tree, and a commit message afterwards.


    kCATransactionDisableActions unterdrückt Implicit transactions.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von Tobse001 ()