본문 바로가기
IOS 기초

[IOS 기초] 12주차 BMI판정 앱(3)

by heeaeeeee 2024. 11. 21.

 

Video Scene 스토리보드와 VideoViewController클래스 연결

 

 

import UIKit

class VideoViewController: UIViewController {
    
    @IBAction func PlayVideo(_ sender: UIButton) {
    
        Bundle.main.path(forResource: "bmi", ofType: "mp4")
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()

    }
    
}

 

 

 

PlayVideo라는 액션에 모든 소스를 작성해줘

 

소스 

// 앱 번들에서 "bmi.mp4" 파일의 경로를 찾아 videoPath 변수에 할당합니다.
let videoPath : String? = Bundle.main.path(forResource: "bmi", ofType: "mp4")

// videoPath를 사용하여 URL 객체를 생성합니다. 
// '!'는 강제 언래핑을 의미하며, videoPath가 nil이 아님을 확신할 때 사용합니다.
let videoURL = URL(filePath: videoPath!)

// videoURL을 사용하여 AVPlayer 객체를 생성합니다. 
// 이 player 객체는 비디오를 재생하는 데 사용됩니다.
let player = AVPlayer(url: videoURL)

// AVPlayerViewController 인스턴스를 생성합니다. 
// 이 컨트롤러는 비디오 재생을 위한 사용자 인터페이스를 제공합니다.
let playerController = AVPlayerViewController()

// 생성한 player를 playerController에 할당합니다.
playerController.player = player

// 현재 뷰 컨트롤러 위에 playerController를 표시합니다. 
// animated: true는 애니메이션과 함께 표시함을 의미합니다.
present(playerController, animated: true)

// 비디오 재생을 시작합니다.
player.play()

 

 

// 앱 번들에서 "bmi.mp4" 파일의 경로를 찾아 videoPath 변수에 할당합니다.
guard let videoPath = Bundle.main.path(forResource: "bmi", ofType: "mp4") else {
    print("Error: Video file not found in bundle.")
    return
}

// videoPath를 사용하여 URL 객체를 생성합니다.
let videoURL = URL(fileURLWithPath: videoPath)

// videoURL을 사용하여 AVPlayer 객체를 생성합니다. 
// 이 player 객체는 비디오를 재생하는 데 사용됩니다.
let player = AVPlayer(url: videoURL)

// AVPlayerViewController 인스턴스를 생성합니다. 
// 이 컨트롤러는 비디오 재생을 위한 사용자 인터페이스를 제공합니다.
let playerController = AVPlayerViewController()

// 생성한 player를 playerController에 할당합니다.
playerController.player = player

// 현재 뷰 컨트롤러 위에 playerController를 표시합니다. 
// animated: true는 애니메이션과 함께 표시함을 의미합니다.
present(playerController, animated: true) { [weak self] in
    // 비디오 재생을 시작합니다.
    player.play()
}

 

present 함수

 

present(_:animated:completion:) | Apple Developer Documentation

Presents a view controller modally.

developer.apple.com

 

if let을 사용한 방식

@IBAction func PlayVideo(_ sender: UIButton) {
    if let videoPath = Bundle.main.path(forResource: "bmi", ofType: "mp4") {
        let videoURL = URL(fileURLWithPath: videoPath)
        let player = AVPlayer(url: videoURL)
        
        let playerController = AVPlayerViewController()
        playerController.player = player
        self.present(playerController, animated: true)
        player.play()
    } else {
        print("비디오 파일을 찾을 수 없습니다.")
        // 여기에 사용자에게 알림을 주는 코드를 추가할 수 있습니다.
    }
}

 

guard let을 사용한 방식

@IBAction func PlayVideo(_ sender: UIButton) {
    guard let videoPath = Bundle.main.path(forResource: "bmi", ofType: "mp4") else {
        print("비디오 파일을 찾을 수 없습니다.")
        // 여기에 사용자에게 알림을 주는 코드를 추가할 수 있습니다.
        return
    }
    
    let videoURL = URL(fileURLWithPath: videoPath)
    let player = AVPlayer(url: videoURL)
    
    let playerController = AVPlayerViewController()
    playerController.player = player
    self.present(playerController, animated: true)
    player.play()
}

 

두 소스의 차이점

self.present(playerViewController, animated: true)
player.play()

> player.play() present 메서드 호출 직후 즉시 실행됩니다. 화면 전환이 완료되기 전에 비디오 재생이 시작될 있습니다. 경우, player.play() present 메서드 호출 직후 즉시 실행됩니다. 화면 전환이 완료되기 전에 비디오 재생이 시작될 있습니다.

self.present(playerViewController, animated: true) {
    player.play()
}

> player.play() present 메서드의 completion handler 내에서 실행됩니다. 화면 전환이 완전히 끝난 후에 비디오 재생이 시작됩니다.

--> 두 번째 방식이 안전하고 일관된 사용자 경험을 제공합니다. 화면 전환이 완료된 비디오가 재생되므로, 사용자는 전체 화면에서 비디오 시작을 있습니다.

 

소스

@IBAction func GoGoogle(_ sender: UIButton) {
        
        let url = URL(string : "https://www.google.co.kr")
        let request = URLRequest(url: url!)
        webView.load(request)
       
}

override func viewDidLoad() {
        super.viewDidLoad()
        guard let url = URL(string: "https://heeaeeeee.tistory.com/") else { return }
        let request = URLRequest(url: url)
        webView.load(request)

}

 

if let을 사용한 방식

@IBAction func GoGoogle(_ sender: UIButton) {
    if let url = URL(string: "https://www.google.co.kr") {
        let request = URLRequest(url: url)
        webView.load(request)
    } else {
        print("유효하지 않은 URL입니다.")
    }
}

 

guard let을 사용한 방식

@IBAction func GoGoogle(_ sender: UIButton) {
    guard let url = URL(string: "https://www.google.co.kr") else {
        print("유효하지 않은 URL입니다.")
        return
    }
    
    let request = URLRequest(url: url)
    webView.load(request)
}

 

 

@IBAction func GoGoogle(_ sender: UIButton) {
        
        guard let url = URL(string : "https://www.google.co.kr") else { return }
        let request = URLRequest(url: url)
        webView.load(request)
        
    }

 

소스 refactoring

@IBAction func goToGoogle(_ sender: UIButton) {
    guard let url = URL(string: "https://www.google.co.kr") else {
        print("Invalid URL")
        return
    }
    
    webView.load(URLRequest(url: url))
}

 

소스 문서화

/// Google 웹사이트로 이동하는 액션 메서드입니다.
/// - Parameter sender: 액션을 트리거한 UIButton 객체입니다.
@IBAction func goToGoogle(_ sender: UIButton) {
    // Google 한국 홈페이지 URL을 생성합니다.
    guard let url = URL(string: "https://www.google.co.kr") else {
        // URL 생성에 실패한 경우 에러 메시지를 출력하고 함수를 종료합니다.
        print("Invalid URL")
        return
    }
    
    // 생성된 URL을 사용하여 웹뷰에 요청을 로드합니다.
    webView.load(URLRequest(url: url))
}

 

BMI_KHA.zip
0.06MB
BMI_hsh.zip
10.32MB

 

 

IOS 강의 자료 참고했습니다.