Update:
Я много думал о своем первоначальном решении.
Если вы являетесь подклассом UITextView
, чтобы добавить нижнюю строку, то нижняя строка лучше должна быть подсмотром самого текстового представления, а не его супер-представления.
И, наконец, я выясню одно решение, которое может добавить нижнюю строку в качестве поднабора TextView
, а нижняя строка не будет перемещаться, когда пользователь прокручивает текст TextView
. В вашем контроллере просмотра вы также можете динамически изменять рамку TextView
, а нижняя строка также будет придерживаться нижней.
Вот код ссылки:
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
}
}
Примечание: Поскольку я использовал для написания кода в Objective-C, я не знаком с Swift. Код выше только для справки (хотя я проверил соответствующий код Objective-C, и она работает, как ожидалось):
Как вы можете видеть, нет код инициализации. Я пытался написать такой код, но он всегда показывает ошибку, и я до сих пор не знаю об этом. Просто убедитесь, чтобы добавить следующий код в код TextView
инициализации:
border = UIView()
addSubview(border)
originalInsetBottom = textContainerInset.bottom
addObserver(self, forKeyPath: "contentOffset", options: .New, context: nil)
Я не знаком с понятием факультативного значения, обручем, разворачивать ... Таким образом, вы должны добавить ?
, !
к коду, если необходимо.
Оригинальный ответ:
self
в коде Означает ли TextView
?
Если да, то когда вы добавляете border
как подслой TextView
, то border
будет двигаться вверх и вниз, когда пользователь прокручивает текст TextView
.
Попытайтесь добавить border
в качестве подслоя с супер взглядом TextView
, а не TextView
.
Вот код (Обратите внимание, что я изменяю border
от CALayer
к UIView
):
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)
}
Вот захват:
PS. Я предлагаю вам изменить второе имя параметра от ширины до высоты, поскольку в этом контексте ширина неоднозначна.
ваше решение идеально подходит для одной ошибки, у меня есть динамическое расширяющееся текстовое представление, поэтому каждый раз, когда текстовое изображение расширяется или уменьшается, положение границы становится пропущенным и будет корректно изменяться при повторном вводе. что может быть причиной? –
@AliAlebrahim Можете ли вы рассказать о «динамическом расширении»? Означает ли это, что вы измените frame.height 'TextView'? – CokileCeoi
да высота изменения текста во время выполнения. –