Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- clean architecture
- Observable
- Human interface guide
- rxswift
- tableView
- 리펙터링
- ios
- HIG
- SWIFT
- RxCocoa
- uitableview
- 리펙토링
- swift documentation
- UITextView
- collectionview
- combine
- 리팩토링
- Clean Code
- 클린 코드
- Protocol
- ribs
- Xcode
- swiftUI
- uiscrollview
- 애니메이션
- map
- Refactoring
- 스위프트
- MVVM
- UICollectionView
Archives
- Today
- Total
김종권의 iOS 앱 개발 알아가기
[iOS - swift] 토스트 메세지 (toast message), 글자에 따른 toast view width 동적 조절, 문자열 크기 동적 계산 본문
iOS 응용 (swift)
[iOS - swift] 토스트 메세지 (toast message), 글자에 따른 toast view width 동적 조절, 문자열 크기 동적 계산
jake-kim 2021. 2. 19. 00:01
toast view를 띄우는 프레임워크 이용
- 커스텀 toastMessageView를 만든 후 toastView를 띄우는 프레임워크를 사용
- 종속성
pod 'Toast-Swift', '~> 5.0.1'
- import
import Toast_Swift
커스텀 ToastMessageView 추가
- ToastMessageView.xib
- ToastMessageView.swift
//
// ToastMessageView.swift
// ToastViewEx
//
// Created by 김종권 on 2021/02/18.
//
import UIKit
class ToastMessageView: UIView {
@IBOutlet weak var toastMessageLabel: UILabel!
override init(frame: CGRect) {
super.init(frame: frame)
xibSetup()
}
override func prepareForInterfaceBuilder() {
super.prepareForInterfaceBuilder()
xibSetup()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
xibSetup()
}
}
extension UIView {
func xibSetup() {
guard let view = loadViewFromNib(nib: type(of: self).className()) else {
return
}
view.translatesAutoresizingMaskIntoConstraints = false
view.frame = bounds
addSubview(view)
}
func loadViewFromNib(nib: String) -> UIView? {
let bundle = Bundle(for: type(of: self))
let nib = UINib(nibName: nib, bundle: bundle)
return nib.instantiate(withOwner: self, options: nil).first as? UIView
}
}
extension NSObject {
var className: String {
return String(describing: type(of: self))
}
static func className() -> String {
return String(describing: self)
}
}
토스트 메세지 띄우는 방법
- 토스트 메세지를 주면, 토스트 뷰의 width를 구하는 함수 정의
private func widthSizeToastViewByComparing(string: String) -> CGFloat {
let temporaryLabel = UILabel()
temporaryLabel.font = UIFont.systemFont(ofSize: 15) // 주의: ToastMessageView에서 지정한 UILabel의 폰트와 폰트사이즈 동일하게 설정
temporaryLabel.text = string
return temporaryLabel.intrinsicContentSize.width + 48.5
}
- 특정 뷰 위에 토스트 메세지 뷰를 띄우는 함수 정의
func showToastView(message: String, above anchorView: UIView, offset: CGFloat) {
let centerX: CGFloat = view.bounds.width / 2
let centerY: CGFloat = anchorView.frame.origin.y - (toastViewHeight / 2) - offset
let point = CGPoint(x: centerX, y: centerY)
self.showToastView(message: message, point: point)
}
func showToastView(message: String, point: CGPoint? = nil) {
let toastViewWidth = widthSizeToastViewByComparing(string: message)
let messageView = ToastMessageView(frame: CGRect(x: 0, y: 0, width: toastViewWidth, height: toastViewHeight))
messageView.layer.cornerRadius = 16
messageView.toastMessageLabel.text = message
if let point = point {
view.showToast(messageView, point: point)
} else {
view.showToast(messageView)
}
toastMessageView?.isHidden = true
toastMessageView = messageView
}
- 문자열의 길이가 달라져도 toast message의 크기가 일정하게 나오는 것을 확인
* 전체 source code: github.com/JK0369/ToastViewExample
최적화 코드 - https://ios-development.tistory.com/636
'iOS 응용 (swift)' 카테고리의 다른 글
[iOS - swift] 내부 크기에 따라 동적으로 width 길이가 증가하는 뷰 (0) | 2021.02.19 |
---|---|
[iOS - swift] StackView 내부 view간의 spacing 설정 방법 (0) | 2021.02.19 |
[iOS - swift] tableView 스크롤바 표출 flashScrollIndicators() (0) | 2021.02.18 |
[iOS - swift] 시간 정보 format (시, 분, 초) (0) | 2021.02.09 |
[iOS - swift] 위치 이동 테스트 (simulate location, .gpx) (0) | 2021.02.09 |
Comments