0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

SwiftでHTMLのaタグみたいなページ内リンク(ジャンプ)を実装してみる

Posted at

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年経過したほどの初心者なので、間違ってるところを多々あるかもしれませんので、その時はぜひ指摘をお願いいたします。

では!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?