Android의 Test와 동일한 기능을 가진 iOS에서 메시지 표시
iOS에서 안드로이드에서 토스트 메시지처럼 동작하는 방법이 있는지 알고 싶습니다.즉, 몇 초 후에 자동으로 해제되는 메시지를 표시해야 합니다.이는 Android 환경에서 Torest 클래스의 기능과 유사합니다.
프로젝트를 활용할 수 있습니다.
HUD 모드 사용MBProgressHUDModeText
토스트 같은 행동 때문에
MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES];
// Configure for text only and offset down
hud.mode = MBProgressHUDModeText;
hud.label.text = @"Some message...";
hud.margin = 10.f;
hud.yOffset = 150.f;
hud.removeFromSuperViewOnHide = YES;
[hud hideAnimated:YES afterDelay:3];
NSString *message = @"Some message...";
UIAlertView *toast = [[UIAlertView alloc] initWithTitle:nil
message:message
delegate:nil
cancelButtonTitle:nil
otherButtonTitles:nil, nil];
[toast show];
int duration = 1; // duration in seconds
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, duration * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
[toast dismissWithClickedButtonIndex:0 animated:YES];
});
iOS 9 이상용 UIAertView 컨트롤러 사용
NSString *message = @"Some message...";
UIAlertController *alert = [UIAlertController alertControllerWithTitle:nil
message:message
preferredStyle:UIAlertControllerStyleAlert];
[self presentViewController:alert animated:YES completion:nil];
int duration = 1; // duration in seconds
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, duration * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
[alert dismissViewControllerAnimated:YES completion:nil];
});
스위프트 3.2
let message = "Some message..."
let alert = UIAlertController(title: nil, message: message, preferredStyle: .alert)
self.present(alert, animated: true)
// duration in seconds
let duration: Double = 5
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + duration) {
alert.dismiss(animated: true)
}
Android에서 토스트는 짧은 시간 동안 화면에 표시된 다음 앱과의 사용자 상호 작용을 방해하지 않고 자동으로 사라지는 짧은 메시지입니다.
그래서 Android 배경을 가진 많은 사람들이 토스트의 iOS 버전이 무엇인지 알고 싶어합니다.현재 문제 외에도 비슷한 문제가 여기, 여기, 그리고 여기에 있습니다.답은 iOS에는 토스트와 정확히 동등한 것이 없다는 것입니다.그러나 다음과 같은 다양한 해결 방법이 제시되었습니다.
- 당신만의 토스트를 만드는 것.
UIView
(여기, 여기, 여기, 여기 및 여기 참조) - 토스트를 모방한 타사 프로젝트 가져오기(여기, 여기, 여기, 여기 및 여기 참조)
- 타이머가 있는 버튼 없는 알림 사용(여기 참조)
하지만 이미 iOS와 함께 제공되는 표준 UI 옵션을 고수하는 것이 좋습니다.당신의 앱을 안드로이드 버전과 똑같이 보이게 하고 행동하려고 하지 마세요.iOS 앱처럼 보이고 느껴지도록 재포장하는 방법을 생각해보세요.다음 링크에서 선택할 수 있습니다.
동일한 정보를 전달하는 방식으로 UI를 재설계하는 것을 고려해 보십시오.또는 정보가 매우 중요한 경우 경고가 정답일 수 있습니다.
스위프트 4
이 작은 속임수는 어떻습니까?
func showToast(controller: UIViewController, message : String, seconds: Double) {
let alert = UIAlertController(title: nil, message: message, preferredStyle: .alert)
alert.view.backgroundColor = UIColor.black
alert.view.alpha = 0.6
alert.view.layer.cornerRadius = 15
controller.present(alert, animated: true)
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + seconds) {
alert.dismiss(animated: true)
}
}
호출 예:
showToast(controller: self, message : "This is a test", seconds: 2.0)
출력:
스위프트 3
타사 코드가 없는 간단한 솔루션의 경우:
일반 UIAlertController를 사용하되 스타일 = 작업만 사용할 수 있습니다.시트(아래 코드 참조)
let alertDisapperTimeInSeconds = 2.0
let alert = UIAlertController(title: nil, message: "Toast!", preferredStyle: .actionSheet)
self.present(alert, animated: true)
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + alertDisapperTimeInSeconds) {
alert.dismiss(animated: true)
}
이 솔루션의 이점:
- Android like 토스트 메시지
- 여전히 iOS 룩앤필
Swift 3 및 4의 경우:
토스터 라이브러리 사용
Toast(text: "Hello, world!", duration: Delay.long)
Swift 2의 경우:
JL토스트 사용
iOS 스타일이 포함된 것을 원한다면 Github에서 이 프레임워크를 다운로드하십시오.
이 예제는 Framework를 가져오면 UIViewController에서 작동합니다.
예 1:
//Manual
let tav = ToastAlertView()
tav.message = "Hey!"
tav.image = UIImage(named: "img1")!
tav.show()
//tav.dismiss() to Hide
예 2:
//Toast Alert View with Time Dissmis Only
self.showToastAlert("5 Seconds",
image: UIImage(named: "img1")!,
hideWithTap: false,
hideWithTime: true,
hideTime: 5.0)
최종:
Swift 4.0:
새 스위프트 파일을 만듭니다. (File-New-File-Empty Swift File).이름을 UIViewTast로 지정합니다.다음 코드를 추가합니다.
import UIKit
func /(lhs: CGFloat, rhs: Int) -> CGFloat {
return lhs / CGFloat(rhs)
}
let HRToastDefaultDuration = 2.0
let HRToastFadeDuration = 0.2
let HRToastHorizontalMargin : CGFloat = 10.0
let HRToastVerticalMargin : CGFloat = 10.0
let HRToastPositionDefault = "bottom"
let HRToastPositionTop = "top"
let HRToastPositionCenter = "center"
// activity
let HRToastActivityWidth : CGFloat = 100.0
let HRToastActivityHeight : CGFloat = 100.0
let HRToastActivityPositionDefault = "center"
// image size
let HRToastImageViewWidth : CGFloat = 80.0
let HRToastImageViewHeight: CGFloat = 80.0
// label setting
let HRToastMaxWidth : CGFloat = 0.8; // 80% of parent view width
let HRToastMaxHeight : CGFloat = 0.8;
let HRToastFontSize : CGFloat = 16.0
let HRToastMaxTitleLines = 0
let HRToastMaxMessageLines = 0
// shadow appearance
let HRToastShadowOpacity : CGFloat = 0.8
let HRToastShadowRadius : CGFloat = 6.0
let HRToastShadowOffset : CGSize = CGSize(width: 4.0, height: 4.0)
let HRToastOpacity : CGFloat = 0.5
let HRToastCornerRadius : CGFloat = 10.0
var HRToastActivityView: UnsafePointer<UIView>?
var HRToastTimer: UnsafePointer<Timer>?
var HRToastView: UnsafePointer<UIView>?
// Color Scheme
let HRAppColor:UIColor = UIColor.black//UIappViewController().appUIColor
let HRAppColor_2:UIColor = UIColor.white
let HRToastHidesOnTap = true
let HRToastDisplayShadow = false
//HRToast (UIView + Toast using Swift)
extension UIView {
//public methods
func makeToast(message msg: String) {
self.makeToast(message: msg, duration: HRToastDefaultDuration, position: HRToastPositionDefault as AnyObject)
}
func makeToast(message msg: String, duration: Double, position: AnyObject) {
let toast = self.viewForMessage(msg: msg, title: nil, image: nil)
self.showToast(toast: toast!, duration: duration, position: position)
}
func makeToast(message msg: String, duration: Double, position: AnyObject, title: String) {
let toast = self.viewForMessage(msg: msg, title: title, image: nil)
self.showToast(toast: toast!, duration: duration, position: position)
}
func makeToast(message msg: String, duration: Double, position: AnyObject, image: UIImage) {
let toast = self.viewForMessage(msg: msg, title: nil, image: image)
self.showToast(toast: toast!, duration: duration, position: position)
}
func makeToast(message msg: String, duration: Double, position: AnyObject, title: String, image: UIImage) {
let toast = self.viewForMessage(msg: msg, title: title, image: image)
self.showToast(toast: toast!, duration: duration, position: position)
}
func showToast(toast: UIView) {
self.showToast(toast: toast, duration: HRToastDefaultDuration, position: HRToastPositionDefault as AnyObject)
}
func showToast(toast: UIView, duration: Double, position: AnyObject) {
let existToast = objc_getAssociatedObject(self, &HRToastView) as! UIView?
if existToast != nil {
if let timer: Timer = objc_getAssociatedObject(existToast!, &HRToastTimer) as? Timer {
timer.invalidate();
}
self.hideToast(toast: existToast!, force: false);
}
toast.center = self.centerPointForPosition(position: position, toast: toast)
toast.alpha = 0.0
if HRToastHidesOnTap {
let tapRecognizer = UITapGestureRecognizer(target: toast, action: #selector(handleToastTapped(recognizer:)))
toast.addGestureRecognizer(tapRecognizer)
toast.isUserInteractionEnabled = true;
toast.isExclusiveTouch = true;
}
self.addSubview(toast)
objc_setAssociatedObject(self, &HRToastView, toast, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN)
UIView.animate(withDuration: HRToastFadeDuration,
delay: 0.0, options: ([.curveEaseOut, .allowUserInteraction]),
animations: {
toast.alpha = 1.0
},
completion: { (finished: Bool) in
let timer = Timer.scheduledTimer(timeInterval: duration, target: self, selector: #selector(self.toastTimerDidFinish(timer:)), userInfo: toast, repeats: false)
objc_setAssociatedObject(toast, &HRToastTimer, timer, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
})
}
func makeToastActivity() {
self.makeToastActivity(position: HRToastActivityPositionDefault as AnyObject)
}
func showToastActivity() {
self.isUserInteractionEnabled = false
self.makeToastActivity()
}
func removeToastActivity() {
self.isUserInteractionEnabled = true
self.hideToastActivity()
}
func makeToastActivityWithMessage(message msg: String){
self.makeToastActivity(position: HRToastActivityPositionDefault as AnyObject, message: msg)
}
func makeToastActivityWithMessage(message msg: String,addOverlay: Bool){
self.makeToastActivity(position: HRToastActivityPositionDefault as AnyObject, message: msg,addOverlay: true)
}
func makeToastActivity(position pos: AnyObject, message msg: String = "",addOverlay overlay: Bool = false) {
let existingActivityView: UIView? = objc_getAssociatedObject(self, &HRToastActivityView) as? UIView
if existingActivityView != nil { return }
let activityView = UIView(frame: CGRect(x:0, y:0, width: self.frame.width, height: self.frame.height))
activityView.center = self.centerPointForPosition(position: pos, toast: activityView)
activityView.alpha = 0.0
activityView.autoresizingMask = ([.flexibleLeftMargin, .flexibleTopMargin, .flexibleRightMargin, .flexibleBottomMargin])
activityView.layer.cornerRadius = HRToastCornerRadius
if HRToastDisplayShadow {
activityView.layer.shadowColor = UIColor.black.cgColor
activityView.layer.shadowOpacity = Float(HRToastShadowOpacity)
activityView.layer.shadowRadius = HRToastShadowRadius
activityView.layer.shadowOffset = HRToastShadowOffset
}
let activityIndicatorView = UIActivityIndicatorView(activityIndicatorStyle: .whiteLarge)
activityIndicatorView.center = CGPoint(x:activityView.bounds.size.width / 2, y: activityView.bounds.size.height / 2)
activityIndicatorView.color = HRAppColor
activityView.addSubview(activityIndicatorView)
activityIndicatorView.startAnimating()
if (!msg.isEmpty){
activityIndicatorView.frame.origin.y -= 10
let activityMessageLabel = UILabel(frame: CGRect(x: activityView.bounds.origin.x, y: (activityIndicatorView.frame.origin.y + activityIndicatorView.frame.size.height + 10), width: activityView.bounds.size.width, height: 20))
activityMessageLabel.textColor = UIColor.white
activityMessageLabel.font = (msg.count<=10) ? UIFont(name:activityMessageLabel.font.fontName, size: 16) : UIFont(name:activityMessageLabel.font.fontName, size: 16)
activityMessageLabel.textAlignment = .center
activityMessageLabel.text = msg + ".."
if overlay {
activityMessageLabel.textColor = UIColor.white
activityView.backgroundColor = HRAppColor.withAlphaComponent(HRToastOpacity)
activityIndicatorView.color = UIColor.white
}
else {
activityMessageLabel.textColor = HRAppColor
activityView.backgroundColor = UIColor.clear
activityIndicatorView.color = HRAppColor
}
activityView.addSubview(activityMessageLabel)
}
self.addSubview(activityView)
// associate activity view with self
objc_setAssociatedObject(self, &HRToastActivityView, activityView, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
UIView.animate(withDuration: HRToastFadeDuration,
delay: 0.0,
options: UIViewAnimationOptions.curveEaseOut,
animations: {
activityView.alpha = 1.0
},
completion: nil)
self.isUserInteractionEnabled = false
}
func hideToastActivity() {
self.isUserInteractionEnabled = true
let existingActivityView = objc_getAssociatedObject(self, &HRToastActivityView) as! UIView?
if existingActivityView == nil { return }
UIView.animate(withDuration: HRToastFadeDuration,
delay: 0.0,
options: UIViewAnimationOptions.curveEaseOut,
animations: {
existingActivityView!.alpha = 0.0
},
completion: { (finished: Bool) in
existingActivityView!.removeFromSuperview()
objc_setAssociatedObject(self, &HRToastActivityView, nil, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
})
}
/*
* private methods (helper)
*/
func hideToast(toast: UIView) {
self.isUserInteractionEnabled = true
self.hideToast(toast: toast, force: false);
}
func hideToast(toast: UIView, force: Bool) {
let completeClosure = { (finish: Bool) -> () in
toast.removeFromSuperview()
objc_setAssociatedObject(self, &HRToastTimer, nil, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
if force {
completeClosure(true)
} else {
UIView.animate(withDuration: HRToastFadeDuration,
delay: 0.0,
options: ([.curveEaseIn, .beginFromCurrentState]),
animations: {
toast.alpha = 0.0
},
completion:completeClosure)
}
}
@objc func toastTimerDidFinish(timer: Timer) {
self.hideToast(toast: timer.userInfo as! UIView)
}
@objc func handleToastTapped(recognizer: UITapGestureRecognizer) {
// var timer = objc_getAssociatedObject(self, &HRToastTimer) as! NSTimer
// timer.invalidate()
self.hideToast(toast: recognizer.view!)
}
func centerPointForPosition(position: AnyObject, toast: UIView) -> CGPoint {
if position is String {
let toastSize = toast.bounds.size
let viewSize = self.bounds.size
if position.lowercased == HRToastPositionTop {
return CGPoint(x: viewSize.width/2, y: toastSize.height/2 + HRToastVerticalMargin)
} else if position.lowercased == HRToastPositionDefault {
return CGPoint(x:viewSize.width/2, y:viewSize.height - toastSize.height - 15 - HRToastVerticalMargin)
} else if position.lowercased == HRToastPositionCenter {
return CGPoint(x:viewSize.width/2, y:viewSize.height/2)
}
} else if position is NSValue {
return position.cgPointValue
}
print("Warning: Invalid position for toast.")
return self.centerPointForPosition(position: HRToastPositionDefault as AnyObject, toast: toast)
}
func viewForMessage(msg: String?, title: String?, image: UIImage?) -> UIView? {
if msg == nil && title == nil && image == nil { return nil }
var msgLabel: UILabel?
var titleLabel: UILabel?
var imageView: UIImageView?
let wrapperView = UIView()
wrapperView.autoresizingMask = ([.flexibleLeftMargin, .flexibleRightMargin, .flexibleTopMargin, .flexibleBottomMargin])
wrapperView.layer.cornerRadius = HRToastCornerRadius
wrapperView.backgroundColor = UIColor.black.withAlphaComponent(HRToastOpacity)
if HRToastDisplayShadow {
wrapperView.layer.shadowColor = UIColor.black.cgColor
wrapperView.layer.shadowOpacity = Float(HRToastShadowOpacity)
wrapperView.layer.shadowRadius = HRToastShadowRadius
wrapperView.layer.shadowOffset = HRToastShadowOffset
}
if image != nil {
imageView = UIImageView(image: image)
imageView!.contentMode = .scaleAspectFit
imageView!.frame = CGRect(x:HRToastHorizontalMargin, y: HRToastVerticalMargin, width: CGFloat(HRToastImageViewWidth), height: CGFloat(HRToastImageViewHeight))
}
var imageWidth: CGFloat, imageHeight: CGFloat, imageLeft: CGFloat
if imageView != nil {
imageWidth = imageView!.bounds.size.width
imageHeight = imageView!.bounds.size.height
imageLeft = HRToastHorizontalMargin
} else {
imageWidth = 0.0; imageHeight = 0.0; imageLeft = 0.0
}
if title != nil {
titleLabel = UILabel()
titleLabel!.numberOfLines = HRToastMaxTitleLines
titleLabel!.font = UIFont.boldSystemFont(ofSize: HRToastFontSize)
titleLabel!.textAlignment = .center
titleLabel!.lineBreakMode = .byWordWrapping
titleLabel!.textColor = UIColor.white
titleLabel!.backgroundColor = UIColor.clear
titleLabel!.alpha = 1.0
titleLabel!.text = title
// size the title label according to the length of the text
let maxSizeTitle = CGSize(width: (self.bounds.size.width * HRToastMaxWidth) - imageWidth, height: self.bounds.size.height * HRToastMaxHeight)
let expectedHeight = title!.stringHeightWithFontSize(fontSize: HRToastFontSize, width: maxSizeTitle.width)
titleLabel!.frame = CGRect(x: 0.0, y: 0.0, width: maxSizeTitle.width, height: expectedHeight)
}
if msg != nil {
msgLabel = UILabel();
msgLabel!.numberOfLines = HRToastMaxMessageLines
msgLabel!.font = UIFont.systemFont(ofSize: HRToastFontSize)
msgLabel!.lineBreakMode = .byWordWrapping
msgLabel!.textAlignment = .center
msgLabel!.textColor = UIColor.white
msgLabel!.backgroundColor = UIColor.clear
msgLabel!.alpha = 1.0
msgLabel!.text = msg
let maxSizeMessage = CGSize(width: (self.bounds.size.width * HRToastMaxWidth) - imageWidth, height: self.bounds.size.height * HRToastMaxHeight)
let expectedHeight = msg!.stringHeightWithFontSize(fontSize: HRToastFontSize, width: maxSizeMessage.width)
msgLabel!.frame = CGRect(x: 0.0, y: 0.0, width: maxSizeMessage.width, height: expectedHeight)
}
var titleWidth: CGFloat, titleHeight: CGFloat, titleTop: CGFloat, titleLeft: CGFloat
if titleLabel != nil {
titleWidth = titleLabel!.bounds.size.width
titleHeight = titleLabel!.bounds.size.height
titleTop = HRToastVerticalMargin
titleLeft = imageLeft + imageWidth + HRToastHorizontalMargin
} else {
titleWidth = 0.0; titleHeight = 0.0; titleTop = 0.0; titleLeft = 0.0
}
var msgWidth: CGFloat, msgHeight: CGFloat, msgTop: CGFloat, msgLeft: CGFloat
if msgLabel != nil {
msgWidth = msgLabel!.bounds.size.width
msgHeight = msgLabel!.bounds.size.height
msgTop = titleTop + titleHeight + HRToastVerticalMargin
msgLeft = imageLeft + imageWidth + HRToastHorizontalMargin
} else {
msgWidth = 0.0; msgHeight = 0.0; msgTop = 0.0; msgLeft = 0.0
}
let largerWidth = max(titleWidth, msgWidth)
let largerLeft = max(titleLeft, msgLeft)
// set wrapper view's frame
let wrapperWidth = max(imageWidth + HRToastHorizontalMargin * 2, largerLeft + largerWidth + HRToastHorizontalMargin)
let wrapperHeight = max(msgTop + msgHeight + HRToastVerticalMargin, imageHeight + HRToastVerticalMargin * 2)
wrapperView.frame = CGRect(x: 0.0, y: 0.0, width: wrapperWidth, height: wrapperHeight)
// add subviews
if titleLabel != nil {
titleLabel!.frame = CGRect(x: titleLeft, y: titleTop, width: titleWidth, height: titleHeight)
wrapperView.addSubview(titleLabel!)
}
if msgLabel != nil {
msgLabel!.frame = CGRect(x: msgLeft, y: msgTop, width: msgWidth, height: msgHeight)
wrapperView.addSubview(msgLabel!)
}
if imageView != nil {
wrapperView.addSubview(imageView!)
}
return wrapperView
}
}
extension String {
func stringHeightWithFontSize(fontSize: CGFloat,width: CGFloat) -> CGFloat {
let font = UIFont.systemFont(ofSize: fontSize)
let size = CGSize(width: width, height: CGFloat.greatestFiniteMagnitude)
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineBreakMode = .byWordWrapping;
let attributes = [NSAttributedStringKey.font:font,
NSAttributedStringKey.paragraphStyle:paragraphStyle.copy()]
let text = self as NSString
let rect = text.boundingRect(with: size, options:.usesLineFragmentOrigin, attributes: attributes, context:nil)
return rect.size.height
}
}
용도:
self.view.makeToast(message: "Simple Toast")
self.view.makeToast(message: "Simple Toast", duration: 2.0, position:HRToastPositionTop)
self.view.makeToast(message: "Simple Toast", duration: 2.0, position: HRToastPositionCenter, image: UIImage(named: "ic_120x120")!)
self.view.makeToast(message: "It is just awesome", duration: 2.0, position: HRToastPositionDefault, title: "Simple Toast")
self.view.makeToast(message: "It is just awesome", duration: 2.0, position: HRToastPositionCenter, title: "Simple Toast", image: UIImage(named: "ic_120x120")!)
self.view.makeToastActivity()
self.view.makeToastActivity(position: HRToastPositionCenter)
self.view.makeToastActivity(position: HRToastPositionDefault, message: "Loading")
self.view.makeToastActivityWithMessage(message: "Loading")
// Hide Toast
self.view.hideToast(toast: self.view)
self.view.hideToast(toast: self.view, force: true)
self.view.hideToastActivity()
사마린을 사용하는 사람들을 위해.IOS는 다음과 같이 수행할 수 있습니다.
new UIAlertView(null, message, null, "OK", null).Show();
UIKit 사용. 필수입니다.
저는 이 솔루션이 잘 작동합니다. https://github.com/cruffenach/CRToast
사용 방법의 예:
NSDictionary *options = @{
kCRToastTextKey : @"Hello World!",
kCRToastTextAlignmentKey : @(NSTextAlignmentCenter),
kCRToastBackgroundColorKey : [UIColor redColor],
kCRToastAnimationInTypeKey : @(CRToastAnimationTypeGravity),
kCRToastAnimationOutTypeKey : @(CRToastAnimationTypeGravity),
kCRToastAnimationInDirectionKey : @(CRToastAnimationDirectionLeft),
kCRToastAnimationOutDirectionKey : @(CRToastAnimationDirectionRight)
};
[CRToastManager showNotificationWithOptions:options
completionBlock:^{
NSLog(@"Completed");
}];
3초 지연을 위한 Swift 4 구문:
present(alertController, animated: true, completion: nil)
DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
self.dismiss(animated: true, completion: nil)
}
3초 후 소멸되는 Alert을 이용한 Android 토스트의 신속한 구현.
func showAlertView(title: String?, message: String?) {
let alertController = UIAlertController(title: title, message: message, preferredStyle: .Alert)
let okAction = UIAlertAction(title: "OK", style: .Cancel, handler: nil)
alertController.addAction(okAction)
self.presentViewController(alertController, animated: true, completion: nil)
let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(3 * Double(NSEC_PER_SEC)))
dispatch_after(delayTime, dispatch_get_main_queue()) {
print("Bye. Lovvy")
alertController.dismissViewControllerAnimated(true, completion: nil)
}
}
간단히 말하면:
self.showAlertView("Message sent...", message: nil)
Swift 2.0의 경우 및 https://stackoverflow.com/a/5079536/6144027 고려 중
//TOAST
let alertController = UIAlertController(title: "", message: "This is a Toast.LENGTH_SHORT", preferredStyle: .Alert)
self!.presentViewController(alertController, animated: true, completion: nil)
let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(2.0 * Double(NSEC_PER_SEC)))
dispatch_after(delayTime, dispatch_get_main_queue()) {
alertController.dismissViewControllerAnimated(true, completion: nil)
}
해결책은
, 신의 Xcode 에프를트 Below code 즐요세기,
- (void)showMessage:(NSString*)message atPoint:(CGPoint)point {
const CGFloat fontSize = 16;
UILabel* label = [[UILabel alloc] initWithFrame:CGRectZero];
label.backgroundColor = [UIColor clearColor];
label.font = [UIFont fontWithName:@"Helvetica-Bold" size:fontSize];
label.text = message;
label.textColor = UIColorFromRGB(0x07575B);
[label sizeToFit];
label.center = point;
[self.view addSubview:label];
[UIView animateWithDuration:0.3 delay:1 options:0 animations:^{
label.alpha = 0;
} completion:^(BOOL finished) {
label.hidden = YES;
[label removeFromSuperview];
}];
}
어떻게 사용합니까?
[self showMessage:@"Toast in iOS" atPoint:CGPointMake(160, 695)];
슬라이드 인&아웃 애니메이션이 포함된 완전히 사용자 지정 가능한 캡슐 모양 토스트 메시지입니다.
extension UIViewController {
func showToast(message : String, fontSize: Int, bgColor: UIColor, textColor: UIColor, width: CGFloat, height: CGFloat, delayTime: Double) {
let toastLabel = UILabel(frame: CGRect(x: self.view.frame.size.width/2 - width/2, y: -10, width: width, height: height))
toastLabel.backgroundColor = bgColor
toastLabel.textColor = textColor
toastLabel.font = UIFont.systemFont(ofSize: CGFloat(fontSize), weight: .bold)
toastLabel.textAlignment = .center
toastLabel.text = message
toastLabel.layer.cornerRadius = height/2
toastLabel.clipsToBounds = true
self.view.addSubview(toastLabel)
self.view.bringSubviewToFront(toastLabel)
UIView.animate(withDuration: 0.5, delay: TimeInterval(delayTime), options: .curveLinear) {
toastLabel.center.y += 60
} completion: { (isCompleted) in
let timer = Timer.scheduledTimer(withTimeInterval: 2.0, repeats: false, block: { _ in
UIView.animate(withDuration: 0.5, delay: TimeInterval(delayTime), options: .curveLinear) {
toastLabel.center.y -= 60
} completion: { (isCompleted) in
}
})
}
}
}
다시 말씀드리지만, 사마린에서 IOS를 사용하는 경우 BTPgrogress라는 새로운 구성 요소가 있습니다.구성 요소 저장소의 HUD
대상 -> 빌드 단계로 이동하고 관련 파일의 "컴파일러 소스"에 -fno-objc-arc를 추가합니다.
함를만고들수,#import "iToast.h"
-(void)showToast :(NSString *)strMessage {
iToast * objiTost = [iToast makeText:strMessage];
[objiTost setFontSize:11];
[objiTost setDuration:iToastDurationNormal];
[objiTost setGravity:iToastGravityBottom];
[objiTost show];
}
토스트 메시지를 표시해야 하는 곳으로 전화하기
[self showToast:@"This is example text."];
나는 토스트를 만드는 간단한 방법을 생각해 냈어요!버튼 없이 UIAlertController 사용!우리는 버튼 텍스트를 우리의 메시지로 사용합니다! 알겠어요? 아래 코드를 참조하십시오.
func alert(title: String?, message: String?, bdy:String) {
let alertController = UIAlertController(title: title, message: message, preferredStyle: .Alert)
let okAction = UIAlertAction(title: bdy, style: .Cancel, handler: nil)
alertController.addAction(okAction)
self.presentViewController(alertController, animated: true, completion: nil)
let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(2 * Double(NSEC_PER_SEC)))
dispatch_after(delayTime, dispatch_get_main_queue()) {
//print("Bye. Lovvy")
alertController.dismissViewControllerAnimated(true, completion: nil)
}
}
다음과 같이 사용합니다.
self.alert(nil,message:nil,bdy:"Simple Toast!") // toast
self.alert(nil,message:nil,bdy:"Alert") // alert with "Alert" button
이것이 Swift 3.0에서 제가 한 방법입니다.UIView 확장을 생성하고 self.view.showToost(메시지: "여기에 메시지", 기간: 3.0) 및 self.view.hideToost()를 호출했습니다.
extension UIView{
var showToastTag :Int {return 999}
//Generic Show toast
func showToast(message : String, duration:TimeInterval) {
let toastLabel = UILabel(frame: CGRect(x:0, y:0, width: (self.frame.size.width)-60, height:64))
toastLabel.backgroundColor = UIColor.gray
toastLabel.textColor = UIColor.black
toastLabel.numberOfLines = 0
toastLabel.layer.borderColor = UIColor.lightGray.cgColor
toastLabel.layer.borderWidth = 1.0
toastLabel.textAlignment = .center;
toastLabel.font = UIFont(name: "HelveticaNeue", size: 17.0)
toastLabel.text = message
toastLabel.center = self.center
toastLabel.isEnabled = true
toastLabel.alpha = 0.99
toastLabel.tag = showToastTag
toastLabel.layer.cornerRadius = 10;
toastLabel.clipsToBounds = true
self.addSubview(toastLabel)
UIView.animate(withDuration: duration, delay: 0.1, options: .curveEaseOut, animations: {
toastLabel.alpha = 0.95
}, completion: {(isCompleted) in
toastLabel.removeFromSuperview()
})
}
//Generic Hide toast
func hideToast(){
if let view = self.viewWithTag(self.showToastTag){
view.removeFromSuperview()
}
}
}
당신이 순수한 swift를 원한다면, 우리는 내부 파일을 공개했습니다.아주 간단합니다.
https://github.com/gglresearchanddevelopment/ios-toast
언급URL : https://stackoverflow.com/questions/18680891/displaying-a-message-in-ios-which-has-the-same-functionality-as-toast-in-android
'programing' 카테고리의 다른 글
윈도우즈가 부팅될 때 오라클 데이터베이스가 시작되지 않도록 방지하는 방법은 무엇입니까? (0) | 2023.06.22 |
---|---|
SSL_connect에서 반환된 =1 errno=0 상태=SSLv3 읽기 서버 인증서 B: 인증서 확인 실패 (0) | 2023.06.22 |
MongoDB 문서에서 특수 문자가 포함된 문자열 검색 (0) | 2023.06.22 |
SQL 내부 조인 on select 문 (0) | 2023.06.17 |
Python 문제의 SQLalchemy에서 Synology NAS의 MariaDB 데이터베이스에 연결 (0) | 2023.06.17 |