UITextView
прокрутка здається проблемою для багатьох людей. Опираючись на відповіді тут (особливо це ) та документацію розробника Apple, використовуючи власну дотепність, ось рішення, яке мені підходить. Ви можете змінити код відповідно до своїх потреб.
Я використовую такий випадок: те саме UITextView
використовується для різних цілей, відображаючи різний вміст за різних обставин. Що я хочу, так це те, що коли вміст змінюється, старе положення прокрутки відновлюється або часом прокручується до кінця. Я не хочу надто багато анімації, коли це робиться. Особливо я не хочу, щоб подання оживляло, як і весь текст був новим. Це рішення спочатку відновлює стару позицію прокрутки без анімації, а потім прокручує до кінця анімований, якщо це потрібно.
Що вам потрібно зробити (або я повинен сказати, що можу зробити), це розширити UITextView наступним чином:
extension UITextView {
func setText(text: String, storedOffset: CGPoint, scrollToEnd: Bool) {
self.text = text
let delayInSeconds = 0.001
let popTime: dispatch_time_t = dispatch_time(DISPATCH_TIME_NOW, Int64(delayInSeconds * Double(NSEC_PER_SEC)))
dispatch_after(popTime, dispatch_get_main_queue(), {
self.setContentOffset(storedOffset, animated: false)
if scrollToEnd && !text.isEmpty {
let popTime: dispatch_time_t = dispatch_time(DISPATCH_TIME_NOW, Int64(delayInSeconds * Double(NSEC_PER_SEC)))
dispatch_after(popTime, dispatch_get_main_queue(), {
self.scrollRangeToVisible(NSMakeRange(text.lengthOfBytesUsingEncoding(NSUTF8StringEncoding) - 1, 0))
})
}
})
}
}
Це оновлює текст, а потім використовує збережене значення UITextView.contentOffset
властивості (або будь-що, що ви передаєте як параметр), і встановлює зміщення подання відповідно. За бажанням після цього він прокручується до кінця нового, потенційно зміненого вмісту.
Я новачок у програмуванні iOS, і я не знаю, чому це працює настільки добре, що це робить, якщо хтось має якусь інформацію про це, було б приємно знати. Також підхід може бути не ідеальним, тому я також відкритий для вдосконалення ідей.
І звичайно завдяки NixonsBack за розміщення відповіді за посиланням вище.
Мій перший допис :), ура!