Computer >> 컴퓨터 >  >> 프로그래밍 >> iOS

iOS WebView에서 프로그래밍 방식으로 스크롤 비활성화하는 방법


iOS에서 WebView의 스크롤을 비활성화하는 방법은 생각보다 훨씬 간단합니다. iOS는 WebView의 scrollView 속성을 외부로 노출하고 있기 때문에, 해당 scrollView의 스크롤 기능만 꺼주면 됩니다.

webView.scrollView.isScrollEnabled = false

위 코드 한 줄이면 WebView에서 스크롤이 더 이상 작동하지 않습니다. 단순히 스크롤만 막고 싶다면 이 코드면 충분하지만, 처음부터 WebView를 로드하고 스크롤을 비활성화하는 전체 과정을 알고 싶다면 아래 순서를 따라가 보세요.

예제 프로젝트 만들기

Xcode에서 샘플 프로젝트를 생성하면서 WebView 로딩과 스크롤 제어 방법을 함께 살펴보겠습니다.

1단계 — 프로젝트 생성

Xcode → New Project → Single View Application을 선택하고 프로젝트 이름을 "WebViewScrollDisabling"으로 지정합니다.

2단계 — WebView 추가

Main.storyboard를 열고 아래 그림과 같이 UIWebView를 화면에 추가합니다.

iOS WebView에서 프로그래밍 방식으로 스크롤 비활성화하는 방법

3단계 — IBOutlet 연결

ViewController 클래스에 위에서 추가한 WebView용 IBOutlet을 선언하고 이름을 webView로 지정합니다.

@IBOutlet weak var webView: UIWebView!

4단계 — 웹 페이지 로드

이 예제에서는 TutorialsPoint 웹사이트를 WebView에 로드합니다. ViewController의 viewDidLoad 메서드에 다음 코드를 추가합니다.

webView.loadRequest(URLRequest(url: URL(string: "https://www.tutorialspoint.com/index.htm")!))

5단계 — 앱 실행 및 스크롤 확인

앱을 실행하면 TutorialsPoint 웹사이트가 정상적으로 로드됩니다. 이 상태에서 WebView를 스와이프해 보면 아직 스크롤이 가능한 것을 확인할 수 있습니다.

iOS WebView에서 프로그래밍 방식으로 스크롤 비활성화하는 방법

6단계 — 스크롤 비활성화

이제 목표는 WebView의 스크롤을 막는 것입니다. WebView 내부에 있는 scrollView의 스크롤을 비활성화하면 되며, 웹뷰를 로드한 뒤 다음 한 줄을 추가합니다.

webView.scrollView.isScrollEnabled = false

코드를 추가한 후 viewDidLoad 메서드는 다음과 같이 완성됩니다.

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    webView.loadRequest(URLRequest(url: URL(string: "https://www.tutorialspoint.com/index.htm")!))
    webView.scrollView.isScrollEnabled = false
}

7단계 — 결과 확인

앱을 다시 실행하면 이전과 마찬가지로 TutorialsPoint 웹사이트가 로드되지만, 이번에는 WebView를 아무리 스와이프해도 스크롤되지 않는 것을 확인할 수 있습니다.

iOS WebView에서 프로그래밍 방식으로 스크롤 비활성화하는 방법

참고: UIWebView는 지원이 중단되었습니다

UIWebView는 iOS 12부터 공식적으로 지원 중단(deprecated)되었으며, 현재는 WKWebView 사용이 권장됩니다. 다행히 WKWebView 역시 scrollView 속성을 제공하므로 동일한 방식으로 스크롤을 비활성화할 수 있습니다.

let webView = WKWebView(frame: view.bounds)
webView.scrollView.isScrollEnabled = false