我正在尝试使用超链接实现UITableView
部分页脚视图。我希望它看起来像所有其他标准的分组UITableView
部分页脚视图,具有相同的指标,字体,颜色等,只有可点击的超链接。尽可能地,我想避免硬编码任何布局值,包括高度。理想情况下,我希望避免使用TTAttributedLabel
等外部依赖项。
编辑:超链接是带下划线的文本链接,而不是带下划线的网址,因此数据检测器不适用。
答案 0 :(得分:3)
我认为这很容易,但似乎我错了。
如果我实例化我自己的UITableViewHeaderFooterView实例,则textLabel
字体(在iOS 9上)与UITableView的标准部分页脚视图字体不匹配(SF UI Text Regular 17与SF UI Text常规13)。默认的NSAttributedString文本颜色也是黑色,与标准灰色不匹配。
-[UITableView footerViewForSection:]
仅适用于-tableView:viewForFooterInSection:
提供的自定义页脚视图,否则返回nil。唯一的方法是获取标准页脚视图(以确定标准字体和颜色值)是不提供自定义页脚视图。传递给-tableView:willDisplayFooterView:forSection:
的视图可以转换为UITableViewHeaderFooterView
并进行检查。这似乎是未记录的行为,并且字体属性来得太晚而不能用于例如计算页脚视图高度。
在询问视图(-tableView:heightForFooterInSection:
)之前,UITableView会询问页脚的高度(-tableView:viewForFooterInSection:
)。这意味着我需要实例化视图以便在早期计算它的高度,例如在-viewDidLoad
时间。但-[UITableViewHeaderFooterView sizeToFit]
计算高度为0.实际上,textLabel
的高度不会计算到-tableView:willDisplayFooterView:forSection:
之后,大概是因为页脚视图不是&#39}。 t已添加到任何容器视图中。
如果我使用UITableViewAutomaticDimension
,UITableView会根据标题(来自-tableView:titleForFooterInSection:
或在storyboard / xib中编码的等效值)计算页脚视图的高度。直到-tableView:willDisplayFooterView:forSection:
之前,这种情况才会发生。
-tableView:willDisplayFooterView:forSection:
时,UITableViewHeaderFooterView的textLabel
仍然具有零帧和零超视图,因此我无法弄清楚如何匹配其帧。这是我能想到的最短,最干净的解决方案。我仍然对字体和textContainerInset
进行硬编码,这并不理想。
class LinkTableViewHeaderFooterView: UITableViewHeaderFooterView {
let textView = UITextView(frame: CGRectZero)
private func _setUpTextView() {
textView.editable = false
textView.scrollEnabled = false
textView.textContainerInset = UIEdgeInsetsMake(0.0, -5.0, 0.0, -5.0) // hard-coded
textView.backgroundColor = UIColor.clearColor()
self.addSubview(textView)
}
override init(reuseIdentifier: String?) {
super.init(reuseIdentifier: reuseIdentifier)
_setUpTextView()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
_setUpTextView()
}
override func layoutSubviews() {
super.layoutSubviews()
self.textView.frame = self.textLabel!.frame // Match frame
}
}
class MyViewController: UITableViewController {
var footerAttributedText: NSAttributedString!
override func viewDidLoad() {
:
self.tableView.registerClass(LinkTableViewHeaderFooterView.self, forHeaderFooterViewReuseIdentifier: "LinkTableViewHeaderFooterView")
let html = "<a href=\"https://en.wikipedia.org/wiki/Lorem_ipsum\">Lorem ipsum</a> dolor sit amet, <a href=\"http://www.example.com/\">consectetur</a> adipisicing elit, sed do eiusmod <a href=\"http://stackoverflow.com\">tempor incididunt ut</a> labore et dolore magna aliqua."
// HTML -> NSAttributedString
let data = html.dataUsingEncoding(NSUTF8StringEncoding)!
let options: [String: AnyObject] = [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute: NSUTF8StringEncoding]
self.footerAttributedText = try? NSAttributedString(data: data, options: options, documentAttributes: nil)
}
override func tableView(tableView: UITableView, titleForFooterInSection section: Int) -> String? {
if section == 1 {
return self.footerAttributedText.string // UITableView will use this value to determine footer height
}
return nil
}
override func tableView(tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
if section == 1 {
return tableView.dequeueReusableHeaderFooterViewWithIdentifier("LinkTableViewHeaderFooterView")
}
return nil
}
override func tableView(tableView: UITableView, willDisplayFooterView view: UIView, forSection section: Int) {
if section == 1 {
guard let footerView = view as? LinkTableViewHeaderFooterView else { return }
let fontAttribute = UIFont.preferredFontForTextStyle(UIFontTextStyleFootnote) // hard-coded
let textColorAttribute = (footerView.textLabel?.attributedText?.attribute(NSForegroundColorAttributeName, atIndex: 0, effectiveRange: nil))! // preserve font color
let attributes = [NSFontAttributeName: fontAttribute, NSForegroundColorAttributeName: textColorAttribute]
let mutableAttributedText = self.footerAttributedText.mutableCopy() as! NSMutableAttributedString
mutableAttributedText.addAttributes(attributes, range: NSMakeRange(0, mutableAttributedText.length))
footerView.textView.attributedText = mutableAttributedText
footerView.textView.tintColor = tableView.tintColor
footerView.textLabel?.attributedText = mutableAttributedText // UITableView will use this value to layout the footer view
footerView.textLabel?.hidden = true
}
}
}
如果有人有任何改进或想法,我很乐意听到。