์๋ ํ์ธ์ Foma ์ ๋๋ค!
์ค๋์ ์์๋ณผ๊ฑด ํ ์คํธ๋ทฐ์์ ๊ธ์จ์ ๋ฐ๋ผ์ ํ ์ด๋ธ๋ทฐ์ ์ ๋์ด๊ฐ ์๋์ผ๋ก ์กฐ์ ๋๋ ๊ธฐ๋ฅ์ ๊ตฌํํด๋ณผ๊ฑฐ์์!
๋ฐ๋ก ์์ํ ๊ฒ์~
Storyboard
์คํ ๋ฆฌ๋ณด๋์์ ํ ์ด๋ธ๋ทฐ ์ปจํธ๋กค๋ฌ๋ฅผ ๋ง๋ค์ด์ฃผ์๊ณ
ํ ์ด๋ธ๋ทฐ์ ์์ ํ ์คํธ๋ทฐ๋ฅผ ๋ฃ์ด์ฃผ์ธ์!
(ํ ์คํธ๋ทฐ๊ฐ ๋์ด๋๋ ๊ฑธ ํ ๋์ผ๋ก ๋ณด๊ธฐ ์ํด ํ ์ด๋ธ๋ทฐ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ ๊ฒ์ ์์ผ๋ก ํด์ฃผ์์ต๋๋ค.)
์คํ ๋ ์ด์์์ ์๋์ ๊ฐ์ด ํด์ฃผ์ธ์!
TableViewCell
ํ ์ด๋ธ๋ทฐ์ ํ ์คํธ๋ทฐ๋ฅผ ์ฐ๊ฒฐํด์ฃผ์ธ์!
class TableViewCell: UITableViewCell {
@IBOutlet weak var textView: UITextView!
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
}
๋จผ์ ํ ์คํธ๋ทฐ์ ๋ฐ๋ผ ํ ์ด๋ธ๋ทฐ์ ์ ๋์ด๊ฐ ๋ฐ๋๊ฒ ํ ํ๋กํ ์ฝ์ ๋ง๋ค์ด์ค๋๋ค.
protocol TableViewCellDelegate:class {
func updateTextViewHeight(_ cell:ApplyTableViewCell,_ textView:UITextView)
}
๋๋ฆฌ๊ฒ์ดํธ๋ ํจ๊ป ๋ง๋ค์ด์ฃผ์ธ์.
weak var delegate: TableViewCellDelegate?
์๋์ ๊ฐ์ด ํ ์คํธ๋ทฐ ์ธํ ์ ํด์ฃผ๊ณ awakeFromNib() ๋ฐ์ ๋ฉ์๋๋ฅผ ์คํ์์ผ์ฃผ์ธ์.
func setTextView() {
textView.delegate = self
textView.isScrollEnabled = false
textView.sizeToFit()
}
ํ ์ด๋ธ๋ทฐ์ ๋ฐ์ UITextViewDelegate๋ฅผ ์ฑํํด์ฃผ์๊ณ
ํ ์คํธ๋ทฐ์ ๊ธ์จ๊ฐ ๋ฐ๋๋๋ง๋ค ํ๋กํ ์ฝ์ ๋ฉ์๋๊ฐ ๋ฐ๋๋๋ก ํฉ๋๋ค.
//MARK:UITextViewDelegate
extension ApplyTableViewCell:UITextViewDelegate {
func textViewDidChange(_ textView: UITextView) {
if let delegate = delegate {
delegate.updateTextViewHeight(self, textView)
}
}
}
TableViewController
๋จผ์ ํ ์ด๋ธ๋ทฐ ์ ์ ๋๋ฆฌ๊ฒ์ดํธ๋ฅผ ํ์ฌ ๋ทฐ์ปจํธ๋กค๋ฌ๋ก ์ค์ ํด์ค๋๋ค.
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "TableViewCell") as! TableViewCell
cell.delegate = self
return cell
}
ํ ์ด๋ธ๋ทฐ์ ํ ๋์ด๋ฅผ ์๋์ ๊ฐ์ด UItableView.automaticDimension์ผ๋ก ์ค์ ํด์ฃผ์ธ์.
(์์์ ํ๋์ด ๋ง์ถฐ์ค์ ๊ฐ์๊ฑด๋ฐ ์ ๋ง ์ ์ฉํฉ๋๋ค!)
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return UITableView.automaticDimension
}
๊ทธ๋ฆฌ๊ณค ๋ค์๊ณผ ๊ฐ์ด TableViewCellDelegate๋ฅผ ์ค์ ํด์ค๋๋ค.
๊ฐ๋จํ ์ค๋ช ๋๋ฆฌ๋ฉด ํ ์คํธ๋ทฐ๊ฐ ๋ฐ๋๋๋ง๋ค ํ ์ด๋ธ๋ทฐ๋ฅผ ์ ๋ฐ์ดํธ ํด์ฃผ๋ ๊ฒ์ ๋๋ค.
extension TableViewController:TableViewCellDelegate {
func updateTextViewHeight(_ cell: TableViewCell, _ textView: UITextView) {
let size = textView.bounds.size
let newSize = tableView.sizeThatFits(CGSize(width: size.width,
height: CGFloat.greatestFiniteMagnitude))
if size.height != newSize.height {
UIView.setAnimationsEnabled(false)
tableView.beginUpdates()
tableView.endUpdates()
UIView.setAnimationsEnabled(true)
}
}
}
์๋๋ ์คํํ์ ๋ ํ๋ฉด์ ๋๋ค!
์์ ํ๋ฉด์ ๋ณด๋ฉด ๋งจ ์ฒ์ ํ ์คํธ๋ทฐ๊ฐ ์คํ๋ ๋ ๋๋ฌด ์๋ค๋ ๋๋์ ๋ฐ์์ด์.
Storyboard
๊ทธ๋์ ์คํ ๋ฆฌ๋ณด๋์ ๋ทฐ๋ฅผ ์ถ๊ฐํด์ ํ ์คํธ๋ทฐ ์๋์๋ค ์ธํ ํด์ฃผ์์ต๋๋ค.
TableViewCell
์๋์ ๊ฐ์ด View๋ฅผ ํ ์ด๋ธ๋ทฐ์ ์ ์ฐ๊ฒฐํด์ฃผ์๊ณ
@IBOutlet weak var emptyView: UIView!
emptyView์ ์ ์ค์ณ ๋ ์ฝ๊ทธ๋์ด์ ๋ฅผ ๋ฃ์ด์ฃผ์๊ณ .
๋ทฐ๋ฅผ ํญํ์๋ ํ ์คํธ๋ทฐ๊ฐ ์คํ(?)๋๊ฒ ํ์๋ฉด ๋ฉ๋๋ค.
func setEmptyView() {
let tap = UITapGestureRecognizer(target: self, action: #selector(tapEmptyView))
emptyView.addGestureRecognizer(tap)
}
@objc func tapEmptyView() {
textView.becomeFirstResponder()
}
setEmptyView๋ awakeFromNib()์์ ์คํ์์ผ์ค๋๋ค.
emptyView๋ฅผ ์ถ๊ฐํ๊ณ ์คํ์ํจ ํ๋ฉด
์ค๋์ ์ด๋ ๊ฒ ํ ์คํธ๋ทฐ์ ๊ธ์จ์ ๋ฐ๋ผ์ ํ ์ด๋ธ๋ทฐ ์ ์ ๋์ด๊ฐ ๋์ ์ผ๋ก ๋ฐ๋๋ ๊ฒ์ ์์๋ณด์์ต๋๋ค.
ํน์๋ผ๋ ์ง์ ํด์ฃผ์ค ๋ถ๋ถ์ด๋ ํ๋ฆฐ์ ์ด ์๋ค๋ฉด ๋๊ธ๋ก ์๋ ค์ฃผ์ธ์!
Source Code
TableViewCell
protocol TableViewCellDelegate:class {
func updateTextViewHeight(_ cell:TableViewCell,_ textView:UITextView)
}
class TableViewCell: UITableViewCell {
weak var delegate: TableViewCellDelegate?
@IBOutlet weak var emptyView: UIView!
@IBOutlet weak var textView: UITextView!
override func awakeFromNib() {
super.awakeFromNib()
setTextView()
setEmptyView()
}
func setTextView() {
textView.delegate = self
textView.isScrollEnabled = false
textView.sizeToFit()
}
func setEmptyView() {
let tap = UITapGestureRecognizer(target: self, action: #selector(tapEmptyView))
emptyView.addGestureRecognizer(tap)
}
@objc func tapEmptyView() {
textView.becomeFirstResponder()
}
}
extension TableViewCell:UITextViewDelegate {
func textViewDidChange(_ textView: UITextView) {
if let delegate = delegate {
delegate.updateTextViewHeight(self, textView)
}
}
}
TableViewController
import UIKit
class TableViewController: UITableViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
// MARK: - Table view data source
override func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 1
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "TableViewCell") as! TableViewCell
cell.delegate = self
return cell
}
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return UITableView.automaticDimension
}
}
extension TableViewController:TableViewCellDelegate {
func updateTextViewHeight(_ cell: TableViewCell, _ textView: UITextView) {
let size = textView.bounds.size
let newSize = tableView.sizeThatFits(CGSize(width: size.width,
height: CGFloat.greatestFiniteMagnitude))
print(newSize)
if size.height != newSize.height {
UIView.setAnimationsEnabled(false)
tableView.beginUpdates()
tableView.endUpdates()
UIView.setAnimationsEnabled(true)
}
}
}
๋๊ธ