UIScrollView sporadisch leer unter iOS 7

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

  • UIScrollView sporadisch leer unter iOS 7

    Hi!

    Tja, was soll ich sagen: Wie im Titel beschrieben habe ich in meiner iOS 7 App das Problem, dass der Inhalt einer UIScrollView manchmal nicht angezeigt wird:

    Ich wechsle über einen UINavigationController in die UIScrollView, die ihrerseits eine (!) View als Content beinhaltet. Bei diesem Wechsel wird in einem Property-Setter die alte Content-View von der UIScrollView entfernt, eine neue Content-View erzeugt, der ScrollView hinzugefügt und deren CALayer bearbeitet (Hintergrundfarbe & Schatten) ... Das lief unter iOS 6.x anstandslos, nun bleibt die UIScrollView aber manchmal leer, bis man z. B. das Device dreht oder eine Geste (Touch, Pinch, ...) auf der View ausführt. Wohlgemerkt nicht immer, sondern nur so alle 15-20 Mal. Ich habe in meiner Verzweiflung schon ein unmotiviertes [self setNeedsDisplay] an das Ende der "Setup"-Methode gestellt, ohne Erfolg.

    Ist einem von Euch dieser Effekt schon einmal begegnet?

    Ciao, Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • Thallius schrieb:

    Wo setzt du denn das Layer?

    Ich setze es nicht wirklich. Nach dem Erzeugen der Content-View und HInzufügen ("addSubView:") zur UIScrollView hole ich mir nur den CALayer der Content-View, um ein paar Properties zu verändern:

    Quellcode

    1. CALayer *contentLayer = self.contentView.layer;
    2. CGRect shadowRect = [self convertRect:viewFrame toView:self.contentView];
    3. [contentLayer setShadowOffset:CGSizeMake(0.0f, 5.0f)];
    4. [contentLayer setShadowRadius:50.0f];
    5. [contentLayer setShadowColor:[[UIColor blackColor] CGColor]];
    6. [contentLayer setBackgroundColor:[[UIColor whiteColor] CGColor]];
    7. [contentLayer setShadowOpacity:0.8f];
    8. [contentLayer setShadowPath:[[UIBezierPath bezierPathWithRect:shadowRect] CGPath]];
    9. [contentLayer setOpaque:YES];

    Anschliessend wird nur noch der ContentOffset gesetzt und dann folgt schon das verzweifelte "setNeedDisplay" ... Eigentlich nichts Schmutziges :)

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • macmoonshine schrieb:

    Ich wäre mit der Verwendung des Content-Views vorsichtig. Der verhält sich teilweise unerwartet. Der Scrollview legt hier beispielsweise auch die Views für die Scroller ab. Warum verwendest Du dafür keinen eigenen View (oder Layer) im Content-View?


    Wäre es auch damit möglich, der Content-View einen Schatten hinzuzufügen? Dieser liegt ja ausserhalb des View-Frames?

    Rein interessehalber gefragt, denn ich habe eben alle Statements, die mit dem CALayer arbeiten auskommentiert und der Effekt bleibt leider...

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • So, ich bin nahezu sicher, den Effekt auf die Verwendung eines CATitledLayers für die Content-View zurückführen zu können. "Nahezu" deshalb, weil der Effekt eben nicht sicher zu reproduzieren ist. Ich habe eben testweise ein normales CALayer verwendet und konnte den Hänger nicht provozieren. Schade nur, dass ich aus Performanz-Gründen und für die Zoom-Funktion einen CATiledLayer benötige.

    Sch...-Spiel, Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • macmoonshine schrieb:

    An wen hast Du das setNeedsDisplay gesendet; an den View oder an den Layer?
    Zeichnest Du über das UIKit? developer.apple.com/library/io…e_ref/doc/uid/DTS40009212
    Wenn der Layer leer bleibt, ruft Cocoa Touch dann trotzdem Deine Zeichenmethoden auf?

    • Aus purer Verzweifelung ging [... setNeedsDisplay] an beide, aber ohne Erfolg
    • Ich zeichne nur mit Core Graphics ... aber aus der falschen Methode heraus ("drawRect:"). Ich habe es gerade umgeändert, aber der Effekt bleibt.
    • Guter Hinweis, hatte ich noch nicht getestet, aber leider ja: Die Zeichenroutinen laufen ... die Anzeige bleibt sporadisch leer.
    So langsam glaube ich, Apple hat da in den Tiefen von CATiledLayer etwas verbockt :(

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.

  • Nochmals danke für diesen Link: Ich habe nun wie gesagt auf "drawLayer:" umgestellt und auch sonst etwas aufgeräumt. Dies hat zwar den ursprünglichen Fehler dieses Postings nicht behoben, aber die Performanz ist deutlich gestiegen, "Geflacker" bei View-Updates sind vermindet ... alles wirkt runder.

    Im Nachhinein ärgert mich, dass ich die Zeichenroutine aufgrund eines anderen Threads schon einmal auf "drawLayer:" hatte und dann aus irgendeinem Grund wieder in "drawRect:" geschoben habe.

    Mit dem zeitweisen Hängen der Anzeige werde ich (mangels weiterer Ideen) vorerst leben.

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.