Update:
dachte ich viel über meine ursprüngliche Lösung.
Wenn Sie UITextView
unterklassifizieren, um eine untere Zeile hinzuzufügen, dann sollte die untere Zeile besser eine Unteransicht der Textansicht selbst sein, als ihre Superansicht.
Und schließlich, finde ich eine Lösung, die als eine Unteransicht von TextView
sich die untere Zeile hinzufügen kann und die untere Zeile wird nicht bewegt, wenn der Benutzer den Text von TextView
scrollt. In Ihrer Ansicht Controller, können Sie auch den Rahmen von TextView
dynamisch ändern, und die untere Zeile wird auch auf der Unterseite bleiben. Hier
ist der Referenzcode:
import UIKit
class TextView: UITextView {
var border: UIView
var originalBorderFrame: CGRect
var originalInsetBottom: CGFloat
deinit {
removeObserver(self, forKeyPath: "contentOffset")
}
override var frame: CGRect {
didSet {
border.frame = CGRectMake(0, frame.height+contentOffset.y-border.frame.height, frame.width, border.frame.height)
originalBorderFrame = CGRectMake(0, frame.height-border.frame.height, frame.width, border.frame.height);
}
}
override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
if keyPath == "contentOffset" {
border.frame = CGRectOffset(originalBorderFrame, 0, contentOffset.y)
}
}
func addBottomBorderWithColor(color: UIColor, width: CGFloat) {
border.backgroundColor = color
border.frame = CGRectMake(0, frame.height+contentOffset.y-width, self.frame.width, width)
originalBorderFrame = CGRectMake(0, frame.height-width, self.frame.width, width)
textContainerInset.bottom = originalInsetBottom+width
}
}
Hinweis: Da ich verwendete Code in Objective-C zu schreiben, ich bin nicht vertraut mit Swift. Der obige Code ist nur für Ihre Referenz (obwohl ich den entsprechenden Objective-C-Code getestet habe, und es funktioniert wie erwartet):
Wie Sie sehen können, gibt es keine Initialisierung Code. Ich habe versucht, solchen Code zu schreiben, aber es zeigt immer einen Fehler und ich habe immer noch keine Ahnung davon. So stellen Sie sicher, dass die folgenden Code in Ihre TextView
Initialisierung Code hinzuzufügen:
border = UIView()
addSubview(border)
originalInsetBottom = textContainerInset.bottom
addObserver(self, forKeyPath: "contentOffset", options: .New, context: nil)
Ich bin nicht mit dem Konzept der optionalen Wert vertraut, wickeln, auspacken ... Also sollten Sie ?
, !
auf den Code hinzufügen, wenn erforderlich.
Ursprüngliche Antwort:
Hat self
in Ihrem Code bedeuten TextView
?
Wenn ja, wenn Sie border
als Unterschicht des TextView
hinzufügen, die border
verschiebt sich nach oben und nach unten, wenn der Benutzer scrollt der Text von TextView
.
Versuchen Sie border
als Sublayer von TextView
's Super View statt TextView
selbst hinzuzufügen.Hier
ist der Code (Beachten Sie, dass ich border
von CALayer
zu UIView
aus):
func addBottomBorderWithColor(color: UIColor, width: CGFloat) {
let border = UIView()
border.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y+self.frame.height-width, textView.frame.width, width)
border.backgroundColor = color
self.superview!.insertSubview(border, aboveSubview: textView)
}
Hier ist die Erfassung:
PS. Ich empfehle Ihnen, den Namen des zweiten Parameters von Breite zu Höhe zu ändern, da die Breite in diesem Kontext mehrdeutig ist.
Ihre Lösung ist perfekt, erwarten Sie für einen Fehler, ich habe eine dynamisch expandierende Textansicht, so dass jedes Mal, wenn die Textansicht erweitert oder schrumpft die Grenzposition verpasst und wird richtig positioniert, wenn ich erneut eintippe. Was könnte der Grund sein? –
@AliAlebrahim Kannst du mehr über "dynamische Erweiterung" erzählen? Bedeutet das, dass du die frame.height von 'TextView' änderst? – CokileCeoi
ja die Höhe der Textansicht ändert sich während der Laufzeit. –