identity inspector
Video Scene 스토리보드와 VideoViewController클래스 연결할 때 사용
videoPath는 optional String형
같은 이름의 player을 구분하기 위해 변수 player은 player1으로 표시
present 함수 사용
import UIKit
import AVKit
class VideoViewController: UIViewController {
@IBAction func playVideo(_ sender: UIButton) {
let videoPath = Bundle.main.path(forResource: "APT", ofType: "mp4") else
let videoURL = URL(filePath: videoPath)
let player1 = AVPlayer(url: videoURL)
let playerController = AVPlayerViewController()
playerController.player = player1
present(playerController, animated: true)
player1.play()
}
}
override func viewDidLoad() {
super.viewDidLoad()
}
}
코드 분석
1. 필요한 프레임워크 임포트
import UIKit
import AVKit
• UIKit: iOS 애플리케이션의 기본 사용자 인터페이스 구성 요소를 제공하는 프레임워크입니다.
• AVKit: 오디오 및 비디오 재생을 위한 고수준의 사용자 인터페이스 구성 요소를 제공합니다. 여기서는 AVPlayerViewController를 사용하여 비디오를 재생합니다.
2. 클래스 정의 및 상속
class VideoViewController: UIViewController {
• VideoViewController: 이 클래스는 UIViewController를 상속받아 화면 전환 및 UI 이벤트 처리를 담당합니다.
• 이 클래스는 특정 버튼 액션으로 비디오를 재생하도록 설계되었습니다.
3. 비디오 재생 메서드
@IBAction func playVideo(_ sender: UIButton) {
• @IBAction: 이 메서드는 스토리보드에서 연결된 버튼의 액션에 반응합니다. 버튼이 눌리면 실행됩니다.
• _ sender: UIButton: 이 메서드에 연결된 버튼 객체를 나타냅니다. 사용자가 어떤 버튼을 눌렀는지 확인할 때 사용할 수 있습니다.
비디오 경로 확인
let videoPath : String? = Bundle.main.path(forResource: "APT", ofType: "mp4")
• Bundle.main.path(forResource:ofType:): 앱의 main bundle에서 APT.mp4 파일 경로를 가져옵니다.
• 반환값은 선택적(Optional) 문자열이므로, 파일이 존재하지 않을 경우 nil을 반환할 수 있습니다.
경로를 URL로 변환
let videoURL = URL(filePath: videoPath!)
• URL(filePath:): 파일 경로 문자열을 URL 객체로 변환합니다.
• videoPath!: 강제 언래핑(force unwrap)을 통해 nil이 아님을 보장합니다. 그러나 파일이 존재하지 않을 경우 앱이 크래시할 수 있으므로 더 안전한 방법은 guard let을 사용하는 것입니다.
AVPlayer 초기화
let player1 = AVPlayer(url: videoURL)
• AVPlayer(url:): 비디오 재생을 위한 플레이어 객체를 생성합니다.
• videoURL을 사용하여 재생할 비디오 파일을 지정합니다.
AVPlayerViewController 설정
let playerController = AVPlayerViewController()
playerController.player = player1
• AVPlayerViewController: 비디오를 재생할 수 있는 뷰 컨트롤러입니다. 기본적으로 비디오 재생에 필요한 UI(재생, 일시정지 버튼 등)를 제공합니다.
• playerController.player: AVPlayer 객체를 AVPlayerViewController에 연결하여 비디오 재생을 설정합니다.
비디오 재생 시작
present(playerController, animated: true)
player1.play()
• present(_:animated:): AVPlayerViewController를 현재 화면에 표시합니다.
• animated: true로 설정하면 화면 전환 시 애니메이션 효과를 적용합니다.
• player1.play(): 비디오 재생을 시작합니다.
4. viewDidLoad 메서드
override func viewDidLoad() {
super.viewDidLoad()
}
• viewDidLoad: 화면이 처음 로드될 때 호출됩니다. 초기 설정을 수행하는 곳으로, 현재 코드에서는 추가 설정이 없습니다.
전체 동작 요약
1. 사용자가 버튼을 누르면 playVideo(_:) 메서드가 호출됩니다.
2. APT.mp4 파일의 경로를 가져옵니다.
• 파일이 없으면 에러 메시지를 출력하고 메서드를 종료합니다.
3. AVPlayer와 AVPlayerViewController를 생성하고 비디오를 연결합니다.
4. 비디오 재생 화면을 현재 화면에 표시하며, 비디오를 재생합니다.
# 코드 개선
1. 비디오 경로 강제 언래핑 개선
videoPath!를 강제 언래핑하면 파일이 없을 때 앱이 크래시할 위험이 있어서 guard let 구문으로 안전하게 처리하는 것이 좋다.
guard let videoPath = Bundle.main.path(forResource: "APT", ofType: "mp4") else { return }
let videoURL = URL(filePath: videoPath)
2.
self.present(playerController, animated: true) {
player1.play()
}
디폴트 인자
함수의 매개변수에 기본값을 제공하여, 호출할 때 매개변수를 생략할 수 있도록 해주는 기능
completion: (() -> Void)? = nil
• completion은 선택적(Optional) 클로저
• 이 클로저는 뷰 컨트롤러가 화면에 표시된 후 실행되는 코드를 정의할 수 있음
• 디폴트 값으로 nil이 설정되어 있기 때문에, 이 매개변수 생략 가능
매개변수 설명
1. viewControllerToPresent
• 화면에 표시할 뷰 컨트롤러 객체
• 필수 매개변수로, 생략 불가
2. animated
• 화면 전환에 애니메이션을 사용할지 여부를 결정
• true: 애니메이션 효과를 적용
• false: 애니메이션 없이 즉시 화면을 전환
3. completion
• 뷰 컨트롤러가 표시된 후 실행할 작업을 정의하는 클로저
• 클로저의 형태: (() -> Void)?
• 반환값이 없으며, 매개변수도 없는 형태
• 디폴트 값: nil (아무 작업도 수행하지 않음)
HTML 화면 띄워주는 Controller
guard문으로 fix
import UIKit
import WebKit
class WebViewController: UIViewController {
@IBOutlet weak var webView: WKWebView!
@IBAction func goNaver(_ sender: UIButton) {
guard let url = URL(string: "https://m.naver.com") else { return }
let request = URLRequest(url: url)
webView.load(request)
}
override func viewDidLoad() {
super.viewDidLoad()
guard let url = URL(string: "https://wse46.tistory.com") else { return }
let request = URLRequest(url: url)
webView.load(request)
}
}
# 공통 코드를 함수로 분리하고 가독성 높게 소스 리팩토링
import UIKit
import WebKit
class WebViewController: UIViewController {
@IBOutlet weak var webView: WKWebView!
// 공통적으로 URL을 로드하는 함수
private func loadWebPage(from urlString: String) {
guard let url = URL(string: urlString) else {
print("Invalid URL: \(urlString)")
return
}
let request = URLRequest(url: url)
webView.load(request)
}
// 네이버로 이동하는 액션
@IBAction func goNaver(_ sender: UIButton) {
loadWebPage(from: "https://m.naver.com")
}
override func viewDidLoad() {
super.viewDidLoad()
// 초기 로드할 웹 페이지
loadWebPage(from: "https://wse46.tistory.com")
}
}
# 각 함수와 속성에 대해 문서화
- WebViewController.swift
import UIKit
import WebKit
/// A view controller that manages a web view to display web pages.
class WebViewController: UIViewController {
/// The WebView used to display web content.
@IBOutlet weak var webView: WKWebView!
/**
Loads a web page from a given URL string.
- Parameter urlString: The string representation of the URL to load.
- Note: If the URL string is invalid, an error message will be printed to the console, and no action will be taken.
*/
private func loadWebPage(from urlString: String) {
guard let url = URL(string: urlString) else {
print("Invalid URL: \(urlString)")
return
}
let request = URLRequest(url: url)
webView.load(request)
}
/**
Handles the action triggered by the "Go to Naver" button.
- Parameter sender: The UIButton that triggered this action.
- Description: This method loads the mobile version of Naver's homepage in the WebView.
*/
@IBAction func goNaver(_ sender: UIButton) {
loadWebPage(from: "https://m.naver.com")
}
/**
Called after the controller’s view is loaded into memory.
- Description: This method initializes the WebView by loading a default webpage (`https://wse46.tistory.com`).
*/
override func viewDidLoad() {
super.viewDidLoad()
loadWebPage(from: "https://wse46.tistory.com")
}
}
- VideoViewController.swift
import UIKit
import AVKit
/// A view controller that manages video playback using `AVPlayer` and `AVPlayerViewController`.
class VideoViewController: UIViewController {
/**
Plays a video file named "APT.mp4" located in the app's main bundle.
- Parameter sender: The UIButton that triggered this action.
- Description:
This method retrieves the video file path from the app's bundle, creates an `AVPlayer` instance for playback, and presents the `AVPlayerViewController` to the user. The video automatically starts playing when the player is presented.
- Note: Ensure that "APT.mp4" is included in the app's bundle to avoid errors.
*/
@IBAction func playVideo(_ sender: UIButton) {
// Fetch the video file path from the app bundle
guard let videoPath = Bundle.main.path(forResource: "APT", ofType: "mp4") else {
print("APT.mp4 파일을 찾을 수 없습니다.")
return
}
// Create a URL for the video file
let videoURL = URL(filePath: videoPath)
// Initialize the AVPlayer with the video URL
let player1 = AVPlayer(url: videoURL)
// Initialize the AVPlayerViewController and set its player
let playerController = AVPlayerViewController()
playerController.player = player1
// Present the AVPlayerViewController and start playback
self.present(playerController, animated: true) {
player1.play()
}
}
/**
Called after the controller's view is loaded into memory.
- Description: This method performs additional setup after the view is loaded. Currently, it does not contain any additional setup logic.
*/
override func viewDidLoad() {
super.viewDidLoad()
// Additional setup after loading the view.
}
}
- ViewController.swift
import UIKit
/// A view controller that calculates BMI (Body Mass Index) based on user input and displays the result.
class ViewController: UIViewController {
// MARK: - Outlets
/// Text field for user input of height (in cm).
@IBOutlet weak var txtHeight: UITextField!
/// Text field for user input of weight (in kg).
@IBOutlet weak var txtWeight: UITextField!
/// Label to display the BMI result and health status.
@IBOutlet weak var lblResult: UILabel!
// MARK: - Actions
/**
Calculates the BMI based on the height and weight provided by the user.
- Parameter sender: The UIButton that triggered this action.
- Description:
This method validates the input fields for height and weight. If the inputs are valid, it calculates the BMI and classifies the user's health status into categories such as "정상" or "비만 단계." The result is displayed with a specific background color representing the classification.
- Note:
- The BMI formula used is: BMI = weight (kg) / (height (m) × height (m)).
- The height input is converted from centimeters to meters in the calculation.
- The method handles invalid inputs by displaying an error message in red text.
*/
@IBAction func calcBmi(_ sender: UIButton) {
// Validate input fields
if txtHeight.text == "" || txtWeight.text == "" {
lblResult.textColor = .red
lblResult.text = "키와 체중을 입력하세요!"
return
}
// Parse input values
let weight = Double(txtWeight.text!)!
let height = Double(txtHeight.text!)!
// Calculate BMI
let bmi = weight / (height * height * 0.0001) // Convert height to meters
let shortenedBmi = String(format: "%.1f", bmi) // Round to one decimal place
// Determine BMI classification
var body = ""
var color = UIColor.white
if bmi >= 40 {
color = UIColor(displayP3Red: 1.0, green: 0.0, blue: 0.0, alpha: 1.0)
body = "3단계 비만"
} else if bmi >= 30 {
color = UIColor(displayP3Red: 0.7, green: 0.0, blue: 0.0, alpha: 1.0)
body = "2단계 비만"
} else if bmi >= 25 {
color = UIColor(displayP3Red: 0.4, green: 0.0, blue: 0.0, alpha: 1.0)
body = "1단계 비만"
} else if bmi >= 18.5 {
color = UIColor(displayP3Red: 0.0, green: 0.0, blue: 0.0, alpha: 1.0)
body = "정상"
} else {
color = UIColor(displayP3Red: 0.0, green: 1.0, blue: 0.0, alpha: 1.0)
body = "저체중"
}
// Display the result
lblResult.backgroundColor = color
lblResult.clipsToBounds = true
lblResult.layer.cornerRadius = 10
lblResult.text = "BMI: \(shortenedBmi), 판정: \(body)"
}
// MARK: - Lifecycle Methods
/**
Called after the controller's view is loaded into memory.
- Description:
Performs any additional setup required after the view is loaded. Currently, no additional setup logic is implemented.
*/
override func viewDidLoad() {
super.viewDidLoad()
// Additional setup after loading the view.
}
}
'iOS프로그래밍기초(Smile Han) > 복습' 카테고리의 다른 글
[iOS] 복습 15 - 클로저(closure) (0) | 2024.12.11 |
---|---|
[iOS] 복습 14 - BMI 앱 구현(4/4) (1) | 2024.12.05 |
[iOS] 복습 12 - BMI 앱 구현(2/4) (2) | 2024.11.20 |
[iOS] 복습 11 - BMI 앱 구현(1/4) (0) | 2024.11.13 |
[iOS] 복습 10 - Xcode로 간단한 앱 개발하기 2 (2) | 2024.11.06 |