2016-11-18 9 views
1

Ich habe eine color slider in einer TableView-Zelle, die sich vom Label bis zum TrailingAnchor der Zelle erstreckt. Das Problem, das ich habe, ist, wenn sich die Ausrichtung des Geräts ändert, der Farbregler seine Beschränkungen nicht aktualisiert und nicht mehr die gesamte Länge der Zelle verlängert. Im Folgenden finden Sie meinen Code zum Einrichten der Einschränkungen für den Farbregler. Unten sind Bilder, um das Problem zu zeigen, das ich habe. Wenn sich mein Telefon bereits in Querformat befindet, wenn ich diese Szene präsentiere, erstreckt sich der Farbschieberegler über die gesamte Länge der Zelle wie gewünscht. Wenn ich jedoch in die Landschaft umschalte, wenn ich diese Szene bereits betrachte, erscheint der Schieberegler wie folgt. Hier ist die full code wenn das hilft.Einschränkungen, die nicht mit Geräteorientierungsänderung aktualisiert werden

Slider Portrait Slider Landscape

func configureColorSlider() { 
    let colorSlider = ColorSlider() 
    let xCell = colorCell.contentView.bounds.width 
    let yCell = colorCell.contentView.bounds.height 
    colorSlider.frame = CGRect(x: xCell/4, y: yCell/4, width: 200, height: 24) 
    colorSlider.orientation = .horizontal 
    colorSlider.addTarget(self, action: #selector(ConfigureTimestampTableViewController.changedColor(_:)), for: .valueChanged) 

    colorCell.contentView.addSubview(colorSlider) 

    colorSlider.translatesAutoresizingMaskIntoConstraints = false 
    NSLayoutConstraint.activate([colorSlider.leadingAnchor.constraint(equalTo: colorLabel.trailingAnchor, constant: 8), 
           colorSlider.trailingAnchor.constraint(equalTo: colorCell.contentView.trailingAnchor, constant: -8), 
           colorSlider.topAnchor.constraint(equalTo: colorCell.contentView.topAnchor, constant: 8), 
           colorSlider.bottomAnchor.constraint(equalTo: colorCell.contentView.bottomAnchor, constant: -8) ]) 


    } 
+0

Ist der Inhalt von 'ColorSlider'' CALayers'? Sie aktualisieren ihre Größe/Position nicht mit dem automatischen Layout. –

+0

Es tut. Verwendet CAGradientLayer(), um den Farbregler zu zeichnen. Das muss das Problem sein. Haben Sie eine Empfehlung für die Größenänderung des Schiebereglers, wenn ich das automatische Layout nicht verwenden kann? – chickenparm

Antwort

1

CALayers nicht UIView wird Größe verändert, sei es durch Auto-Layout oder manuell als Reaktion auf ihre Mutter Größe verändert werden.

Sie müssen nur Code zu Ihrem ColorSlider hinzufügen, der den Layer aktualisiert, wenn sich die Größe/Position des ColorSilider ändert. Zum Glück gibt es eine Methode auf UIView, die speziell dafür ist.

override func layoutSubviews() { 
    super.layoutSubviews() 
    gradientLayer.frame = bounds 
} 
+0

Danke! Xcode hat mich dazu gebracht, diese Funktion öffentlich zu machen, als ich es hinzugefügt habe, aber es hat funktioniert! Ohne öffentliche gab es mir die Nachricht "Override-Instanz-Methode muss so zugänglich sein wie seine umschließende Art" – chickenparm

+0

Das ist richtig. Wenn 'ColorSlider' öffentlich ist, müssen alle Methoden, die Sie überschreiben, auch öffentlich sein. –

Verwandte Themen