htmlであれば、ページ内リンクはすごく簡単ですが、Swiftではどうなのでしょうか。
それをやってみたいと思います。
コード
まずは全体コードから
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var myScrollView: UIScrollView!
@IBOutlet weak var enableTapTextView: UITextView! //メインのTextView
@IBOutlet weak var forScrollLabel: UILabel! //スクロール先
override func viewDidLoad() {
super.viewDidLoad()
//基本設定
enableTapTextView.delegate = self
enableTapTextView.isEditable = false
//TextView内の文字をタップ可能にする
let attributeString = NSMutableAttributedString(string: enableTapTextView.text)
attributeString.addAttribute(.link, value: "myLink", range: NSString(string: enableTapTextView.text).range(of: "記事コンテンツ①"))//valueは任意の値
//リンク色を青から黒に変える
enableTapTextView.linkTextAttributes = [.foregroundColor:UIColor.black]
//下線を引く
enableTapTextView.linkTextAttributes = [.underlineStyle:NSUnderlineStyle.single.rawValue]
//最後に追加する
enableTapTextView.attributedText = attributeString
}
}
extension ViewController : UITextViewDelegate{
func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange) -> Bool {
let urlString = URL.absoluteString
if urlString == "myLink"{ //href属性
//記事内リンクスクロール(アニメーション付き)
UIView.animate(withDuration: 0.5) {
self.myScrollView.contentOffset = CGPoint(x: 0, y: self.forScrollLabel.frame.origin.y)
}
}
return false
}
}
では、何をやってるのか簡単に説明します。
(ちなみに、スクロールビューは各自で用意をお願いいたします。)
まずは、TextViewをカスタムできるようにするため、NSMutableStringに入れます。
次に、その種類や値、適用させる範囲などをaddAttributeに設定していきます。リンク化させたいので.link、適用範囲はここでは”記事コンテンツ①”としています。自由に設定してください。
ちなみに「value」は、HTMLでいうところのaタグ(アンカータグ)の中の「id属性」になります。こちらも自由です。
そして後は、見やすいように線を引いたりしてます。
最後は、リンクの遷移先を設定しています。
extension ViewController : UITextViewDelegate{
func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange) -> Bool {
let urlString = URL.absoluteString
if urlString == "myLink"{ //href属性
//スクロールさせる(アニメーション付き)
UIView.animate(withDuration: 0.5) {
self.myScrollView.contentOffset = CGPoint(x: 0, y: self.forScrollLabel.frame.origin.y)
}
}
return false
}
}
このTextViewのメソッドは、いわばURLの指定先を受け取る場所です。
ここではページ内に遷移したいので、上記のようにしてます。
もし例えば、外部ページに飛びたい場合は、SFSafariViewControllerなどで対応すると良いと思います。
あと、遷移先オブジェクト(ここではforScrollLabel)のoriginYを指定することで、良い感じにタイトルがページの一番上部にぴたっとつくようになります。
最後に
お疲れ様でした。
自分はまだSwiftを勉強し始めて1年経過したほどの初心者なので、間違ってるところを多々あるかもしれませんので、その時はぜひ指摘をお願いいたします。
では!