2010-12-07 7 views
9

Ich habe eine UIScrollView, die eine benutzerdefinierte UIView enthält. Innerhalb der benutzerdefinierten UIView möchte ich das Rechteck, in dem es sichtbar ist (d. H. Nicht abgeschnitten).Erhalten eines UIViews sichtbares Rechteck

Die Quick-n-Dirty-Lösung soll die benutzerdefinierte UIView davon ausgehen, dass das übergeordnete ein UIScrollView ist und die Inhaltsgröße durch es erhalten, aber ich bin auf der Suche nach einer besseren Lösung, die solche Annahmen nicht machen.

Antwort

2

Es würde helfen, wenn Sie mehr Informationen darüber geben würden, was Sie erreichen möchten.

Wenn Sie die Größe der super Blick wissen, dass Sie dies tun können:

CGRect superFrame = [self superview].frame; 
+0

Nein, das wird nicht funktionieren. Nach was ich suche, ist das sichtbare rect der Ansicht, nicht der gesamte Rahmen der Ansicht. Wenn sich beispielsweise ein Teil von UIView A mit einem anderen UIView B überschneidet, was ist der sichtbare Bereich von UIView A, der für den Benutzer sichtbar ist? –

17

Dies sollte

CGRect visibleRect = CGRectIntersection(self.frame, superview.bounds); 

Verwenden Sie den Trick, der in der UIView und es sollten Sie die Rechteck (falls vorhanden), das den sichtbaren Bereich dieser Ansicht in seiner Superansicht darstellt (The UIScrollView). Ich gehe hier davon aus, dass es in der Hierarchie keine Sicht zwischen ihnen gibt, aber wenn es da ist, sollte das Fiedeln des Codes trivial sein.

Hoffe, dass ich helfen könnte!

+1

Sollte das nicht "superview.bounds" sein, da der Frame der Superview in seinem Superview Koordinatenraum liegt? –

+0

@ Awesome-o: Du hast Recht. Mein ursprünglicher Code nahm an, dass der Superview den gesamten Bildschirm ausfüllte (0, 0 Ursprung), aber Grenzen wären sicherer zu verwenden, falls nicht. Aktualisierte Antwort – foslock

1

Swift 3

extension UIView { 
    var visibleRect: CGRect? { 
     guard let superview = superview else { return nil } 
     return frame.intersection(superview.bounds) 
    } 
} 
Verwandte Themen