よく使うデリゲートのテンプレート

よく必要になり、かつ覚えるのが面倒なデリゲート。
テンプレートとしてメモっておく。

# UIScrollViewDelegate

```swift
// MARK: - UIScrollViewDelegate.

extension ViewController: UIScrollViewDelegate {
	
    // スクロール中に呼び出され続けるデリゲートメソッド.
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        print(#function)
    }

    // ズーム中に呼び出され続けるデリゲートメソッド.
    func scrollViewDidZoom(_ scrollView: UIScrollView) {
        print(#function)
    }

    // ユーザが指でドラッグを開始した場合に呼び出されるデリゲートメソッド.
    func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
        print(#function)
    }
	
    // ユーザがドラッグ後、指を離した際に呼び出されるデリゲートメソッド.
    // velocity = points / second.
    // targetContentOffsetは、停止が予想されるポイント？
    // pagingEnabledがYESの場合には、呼び出されません.
    func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
        print(#function)
    }
	
    // ユーザがドラッグ後、指を離した際に呼び出されるデリゲートメソッド.
    // decelerateがYESであれば、慣性移動を行っている.
    //
    // 指をぴたっと止めると、decelerateはNOになり、
    // その場合は「scrollViewWillBeginDecelerating:」「scrollViewDidEndDecelerating:」が呼ばれない？
    func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
        print(#function)
    }

    // ユーザがドラッグ後、スクロールが減速する瞬間に呼び出されるデリゲートメソッド.
    func scrollViewWillBeginDecelerating(_ scrollView: UIScrollView) {
        print(#function)
    }

    // ユーザがドラッグ後、慣性移動も含め、スクロールが停止した際に呼び出されるデリゲートメソッド.
    func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
        print(#function)
    }

    // スクロールのアニメーションが終了した際に呼び出されるデリゲートメソッド.
    // アニメーションプロパティがNOの場合には呼び出されない.
    // 【setContentOffset】/【scrollRectVisible:animated:】
    func scrollViewDidEndScrollingAnimation(_ scrollView: UIScrollView) {
        print(#function)
    }

    // ズーム中に呼び出されるデリゲートメソッド.
    // ズームの値に対応したUIViewを返却する.
    // nilを返却すると、何も起きない.
    func viewForZooming(in scrollView: UIScrollView) -> UIView? {
        print(#function)
        return nil
    }

    // ズーム開始時に呼び出されるデリゲートメソッド.
    func scrollViewWillBeginZooming(_ scrollView: UIScrollView, with view: UIView?) {
        print(#function)
    }

    // ズーム完了時(バウンドアニメーション完了時)に呼び出されるデリゲートメソッド.
    func scrollViewDidEndZooming(_ scrollView: UIScrollView, with view: UIView?, atScale scale: CGFloat) {
        print(#function)
    }

    // 先頭にスクロールする際に呼び出されるデリゲートメソッド.
    // NOなら反応しない.
    func scrollViewShouldScrollToTop(_ scrollView: UIScrollView) -> Bool {
        print(#function)
        return true
    }

    // 先頭へのスクロールが完了した際に呼び出されるデリゲートメソッド.
    // すでに先頭にいる場合には呼び出されない.
    func scrollViewDidScrollToTop(_ scrollView: UIScrollView) {
        print(#function)
    }

    // スクロールビューのinsetsの値が変わった際に呼び出されるデリゲートメソッド.
    func scrollViewDidChangeAdjustedContentInset(_ scrollView: UIScrollView) {
        print(#function)
    }
}
```

# UISearchBarDelegate

```swift
// MARK: - UISearchBarDelegate.

extension ViewController: UISearchBarDelegate {

	// フォーカスが当たる際に呼び出されるメソッド(編集の可否を定義可能).
	func searchBarShouldBeginEditing(_ searchBar: UISearchBar) -> Bool {
		print(#function)
		return true
	}
	
	// フォーカスがあたった際に呼び出されるメソッド.
	func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) {
		print(#function)
		searchBar.setShowsCancelButton(true, animated: true)
	}

	// フォーカスが外れる際に呼び出されるメソッド(編集終了の可否を定義可能).
	func searchBarShouldEndEditing(_ searchBar: UISearchBar) -> Bool {
		print(#function)
		return true
	}
	
	// フォーカスが外れた際に呼び出されるメソッド.
	func searchBarTextDidEndEditing(_ searchBar: UISearchBar) {
		print(#function)
	}
	
	// called when text changes (including clear)
	func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
		print(#function)
	}
	
	// 入力に変更があった際に呼び出されるメソッド.
	func searchBar(_ searchBar: UISearchBar, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
		print(#function)
		return true
	}
	
	// 検索キータップ時に呼び出されるメソッド.
	func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
		print(#function)
		searchBar.resignFirstResponder()
		searchBar.setShowsCancelButton(false, animated: true)
	}
	
	// called when bookmark button pressed.
	func searchBarBookmarkButtonClicked(_ searchBar: UISearchBar) {
		print(#function)
	}
	
	// キャンセルボタンタップ時に呼び出されるメソッド.
	func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
		print(#function)
		searchBar.resignFirstResponder()
		searchBar.setShowsCancelButton(false, animated: true)
	}
	
	// called when search results button pressed
	func searchBarResultsListButtonClicked(_ searchBar: UISearchBar) {
		print(#function)
	}
	
	func searchBar(_ searchBar: UISearchBar, selectedScopeButtonIndexDidChange selectedScope: Int) {
		print(#function)
	}
}
```

# UITextFieldDelegate

```swift
// MARK: - UITextFieldDelegate.

extension ViewController: UITextFieldDelegate {

	// フォーカスが当たる際に呼び出されるメソッド(編集の可否を定義可能).
	func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
		print(#function)
		return true
	}
	
	// フォーカスがあたった際に呼び出されるメソッド.
	func textFieldDidBeginEditing(_ textField: UITextField) {
		print(#function)
	}
	
	// フォーカスが外れる際に呼び出されるメソッド(編集終了の可否を定義可能).
	func textFieldShouldEndEditing(_ textField: UITextField) -> Bool {
		print(#function)
		return true
	}
	
	// フォーカスが外れた際に呼び出されるメソッド.
	func textFieldDidEndEditing(_ textField: UITextField) {
		print(#function)
	}
	
	// 入力に変更があった際に呼び出されるメソッド.
	func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
		print(#function)
		return true
	}
	
	// クリアボタンが押された際に呼び出されるメソッド.
	func textFieldShouldClear(_ textField: UITextField) -> Bool {
		print(#function)
		return true
	}
	
	// Returnキータップ時に呼び出されるメソッド(Returnキータップの可否を定義可能).
	func textFieldShouldReturn(_ textField: UITextField) -> Bool {
		print(#function)
		textField.resignFirstResponder()
		return true
	}
}
```