2017-03-24 2 views
-2

Ich möchte diese Subview über seine Superview hinaus erweitern, aber die Superview-Grenze schneidet in die Subview. Gibt es einen Weg dies zu verhindern?Superview Grenze schneidet in Subview

Example

class TheView : UIView { 

    let theSubView = UIButton() 


    override init(frame: CGRect) { 
     super.init(frame: frame) 

     layer.borderColor = UIColor.gray.cgColor 
     layer.borderWidth = 1 
     clipsToBounds = false 

     addSubview(theSubView) 

     theSubView.backgroundColor = UIColor.green 
     theSubView.frame = CGRect(x: 0, y: -10, width: 50, height: 50) 
    } 
} 
+0

Oh, Sie meinen, so dass die graue Grenze durch das grüne Quadrat versteckt ist? – Fogmeister

+0

Ja das ist richtig –

Antwort

0

Statt die Ansicht der Schicht der Grenze zu verwenden, ziehen Sie die Grenze selbst:

class TheView : UIView { 

    let theSubView = UIButton() 

    override func draw(_ rect: CGRect) { 
     UIColor.gray.set() 
     UIBezierPath(rect: rect).stroke() 
    } 

    override init(frame: CGRect) { 
     super.init(frame: frame) 
     clipsToBounds = false 
     isOpaque = false 

     addSubview(theSubView) 

     theSubView.backgroundColor = UIColor.green 
     theSubView.frame = CGRect(x: 0, y: -10, width: 50, height: 50) 
    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 
} 

enter image description here

+1

Sie könnten auch 'contentMode = .redraw' setzen. –

0

Ich denke, es ist besser, die Struktur Ihrer Ansichten neu zu gestalten, so dass theView muss sich nicht darum kümmern, was außerhalb seiner Grenzen liegt.
Zum Beispiel können Sie sowohl das größere als auch das kleinere Rechteck als Unteransicht haben. Dann legen Sie die kleinere Rect über die größere. Dann sollte es in der Lage sein, die Grenzlinie abzudecken.

0

Sie können nicht den eigenen Rahmen der Ansicht unter dem Inhalt von Unteransichten erscheinen lassen. Dies wird in (zum Beispiel) die CALayer borderWidth reference dokumentiert:

Es ist oberhalb des Empfängers Inhalt Compositing und Subschichten ...

Ein Weg, um es zu beheben ist eine separate Subview fügen Sie einfach die Grenze zu ziehen, und platzieren Sie die Randzeichnung unterhalb der Schaltfläche. Beispiel:

@IBDesignable 
class TheView : UIView { 

    override init(frame: CGRect) { 
     super.init(frame: frame) 
     commonInit() 
    } 

    private let borderView = UIView() 
    private let button = UIButton() 

    private func commonInit() { 
     borderView.layer.borderColor = UIColor.gray.cgColor 
     borderView.layer.borderWidth = 1 
     borderView.autoresizingMask = [.flexibleWidth, .flexibleHeight] 
     borderView.frame = bounds 
     addSubview(borderView) 

     button.backgroundColor = UIColor.green 
     button.frame = CGRect(x: 0, y: -10, width: 50, height: 50) 
     addSubview(button) 
    } 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
     commonInit() 
    } 

} 

Ergebnis:

screen shot of result

Verwandte Themen