
legacy - 대체로 머지 않아 지원이 중단 될 가능성이 큰 구식 코드나 기능을 의미
import UIKit
import WebKit
class WebViewController: UIViewController {
@IBAction func naver(_ sender: UIButton) {
guard let url = URL(string: "https://m.naver.com")else{return}
let request = URLRequest(url: url)
webView.load(request)
}
@IBOutlet weak var webView: WKWebView!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
}
외부 앱 열기
- if let appleWebsite = URL(string: "https://www.apple.com") { UIApplication.shared.open(appleWebsite) }
- if let url = URL(string: "tel://123-4567") { UIApplication.shared.open(url) }
- if let google = URL(string: "comgooglemaps://?q=서울역") { UIApplication.shared.open(google)}

URLRequest요청
(url:cachePolicy:timeoutInterval)
색의 차이로 함수 내부의 default매개변수(기본값이 있어서 값을 넣지 않아도 되는 값)를 구분
시험 출제 가능성

BBMIcjh -> Build Phases -> Choose frameworks and libraries to add: -> WebKit.framework
원래는 위 단계를 거쳐야 하지만 상위 버전의 Xcode버전일 경우 자동으로 해결된다.
import UIKit
import WebKit
class WebViewController: UIViewController {
@IBAction func naver(_ sender: UIButton) {
/* 1
let url1 = URL(string: "https://m.naver.com")
let request = URLRequest(url: url1!)
webView.load(request)
*/
/*2*/
guard let url = URL(string: "https://m.naver.com")else{return}
let request = URLRequest(url: url)
webView.load(request)
/**/
}
@IBOutlet weak var webView: WKWebView!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
}
/*url 링크 기능을 실현하는 방법*/

앱을 출시하고 싶다면 회전 시 UI도 신경써서 만들어야 한다
AutoLayout 기능 문제 해결 필요

아래는 align 정렬 메뉴

Xcode에서 autolayout을 적용하는 방법
📐 Xcode에서 Auto Layout을 적용하는 방법
Xcode에서 Auto Layout은 다양한 화면 크기, 방향(가로/세로), 그리고 장치(iPhone, iPad)에 맞게 UI 요소의 크기와 위치를 동적으로 조정할 수 있도록 해주는 시스템입니다.
Auto Layout을 적용하는 방법은 크게 3가지가 있으며, 모두 **Interface Builder (스토리보드/XIB)**에서 진행됩니다.
1. 캔버스 기반 도구를 사용한 제약 조건 추가 (권장)
Xcode의 Interface Builder 오른쪽 하단에 있는 툴바를 사용하여 제약 조건을 가장 쉽고 빠르게 추가할 수 있습니다.
1.1. 📍 Add New Constraints (핀 메뉴)
이 메뉴는 뷰의 크기와 위치를 명시적으로 정의하는 데 사용됩니다.
- UI 요소 선택: 제약 조건을 적용할 뷰(예: UILabel, UIButton)를 캔버스에서 선택합니다.
- 핀 메뉴 열기: Interface Builder 오른쪽 하단의 'Add New Constraints' 버튼 (핀 모양)을 클릭합니다. *
- 위치 제약 조건 추가:
- 상단(Top), 하단(Bottom), 선행(Leading), 후행(Trailing)의 4개 T자 모양 컨트롤에서 제약 조건을 걸고 싶은 방향을 선택합니다.
- 입력 필드에 안전 영역(Safe Area) 또는 주변 뷰로부터의 **거리(Spacing)**를 입력합니다.
- (선택) Constrain to margins 옵션을 해제하면 슈퍼뷰의 경계선에 직접 제약을 걸 수 있습니다.
- 크기 제약 조건 추가:
- **Width**와 Height 체크박스를 선택하고 원하는 크기 값을 입력합니다.
- 적용: 하단의 Add [숫자] Constraints 버튼을 클릭하여 제약 조건을 적용합니다.
1.2. 🔗 Align (정렬 메뉴)
이 메뉴는 두 개 이상의 뷰를 정렬하거나, 뷰를 슈퍼뷰의 중앙에 배치할 때 사용됩니다.
- UI 요소 선택: 정렬할 뷰를 하나 또는 여러 개 선택합니다.
- 정렬 메뉴 열기: Interface Builder 오른쪽 하단의 'Align' 버튼 (별 두 개 겹쳐진 모양)을 클릭합니다.
- 정렬 방식 선택:
- Horizontally in Container 또는 Vertically in Container: 뷰를 슈퍼뷰의 중앙에 수평 또는 수직으로 배치합니다.
- Leading Edges, Trailing Edges 등: 여러 뷰를 선택했을 때, 각 뷰의 해당 가장자리를 정렬합니다.
- 적용: 하단의 Add [숫자] Constraints 버튼을 클릭합니다.
2. Stack View를 사용한 배치
**UIStackView**는 수평 또는 수직 방향으로 여러 뷰를 자동으로 배치하고 크기를 조정해주는 강력한 도구입니다. 복잡한 제약 조건을 직접 걸 필요가 없어 가장 선호되는 방식입니다.
- UI 요소 선택: 묶어서 관리할 뷰들을 모두 선택합니다.
- 임베드 메뉴 열기: Interface Builder 오른쪽 하단의 'Embed In' 버튼 (삼각형과 사각형 겹쳐진 모양)을 클릭합니다.
- 스택 뷰 선택: 팝업 메뉴에서 **Stack View**를 선택합니다. *
- 스택 뷰 설정:
- Attributes Inspector에서 스택 뷰의 Axis (수평/수직), Alignment, Distribution (공간 분배 방식), Spacing (뷰 사이의 간격)을 설정합니다.
- 스택 뷰 제약 조건 추가: 이제 개별 뷰가 아닌, 스택 뷰 자체에 대해 1번 방법(핀 메뉴)을 사용하여 위치와 크기 제약 조건을 추가합니다. (예: 스택 뷰를 화면 중앙에 고정하고 너비를 설정)
3. 코드를 사용한 Auto Layout (NSLayoutConstraint/Anchor)
스토리보드를 사용하지 않거나, 동적으로 뷰를 생성할 때 코드로 직접 제약 조건을 설정합니다.
A. NSLayoutConstraint (과거 방식)
let leadingConstraint = NSLayoutConstraint(
item: myView,
attribute: .leading,
relatedBy: .equal,
toItem: superview,
attribute: .leading,
multiplier: 1.0,
constant: 20
)
leadingConstraint.isActive = true
B. NSLayoutAnchor (현재 권장 방식)
**Anchor(앵커)**를 사용하여 제약 조건을 설정하는 것이 훨씬 간결하고 가독성이 좋습니다.
// 코드에서 Auto Layout을 사용할 뷰에 대해 필수적으로 false로 설정해야 합니다.
myView.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
// 상단 안전 영역에서 20pt 떨어진 곳에 배치
myView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 20),
// 너비를 슈퍼뷰 너비와 같게 설정
myView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20),
myView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -20),
// 높이를 50pt로 설정
myView.heightAnchor.constraint(equalToConstant: 50)
])

present(playerViewController, animated: true)
player.play()
//뷰 컨트롤러가 완전히 로드되고 화면에 표시될 준비가 되기 전에 재생을 시작.
//동영상이나 오디오가 아직 보이지 않거나 재생 준비가 안 된 상태에서 소리가 먼저 들리거나, //오류가 발생할 가능성 있음
self.present(playerViewController, animated: true)
player.play()
self.present(playerViewController, animated: true) { player.play()
} //후행 클로저(trailing closure)
//뷰 컨트롤러가 완전히 준비된 상태에서만
//플레이어가 재생되도록 보장하기 때문에 가장 안전하고 안정적인 방법 //완료 핸들러(Completion Handler)는 "작업 완료 후 호출"
trailing closure 후행 클로저
클로저에서 $1, $0 반드시 시험에 출제
영어이름도 알아두삼
completion handler

-> 요거도 생략 가능
단축 인자 사용

*************************
3단계의 간략화를 컨닝페이퍼에 작성하자
*************************
'computing' 카테고리의 다른 글
| 20251127-android13, 그래픽, Empty Views Activity menu해결 (0) | 2025.11.27 |
|---|---|
| javaweb 13 정리 (0) | 2025.11.26 |
| 20251117 - iOS12 (0) | 2025.11.17 |
| android11 (0) | 2025.11.13 |
| 20251103_iOS10 (0) | 2025.11.03 |