【问题标题】:Creating Custom UIView and display as Pop Up in Swift在 Swift 中创建自定义 UIView 并显示为弹出窗口
【发布时间】:2015-03-23 06:05:02
【问题描述】:

我正在尝试创建一个自定义 UIView 并使用 Swift 在我的主视图中将其显示为弹出窗口。

我的自定义UIView 代码是

class DatePopUpView: UIView {
var uiView:UIView?

override init()  {
    super.init()
    self.uiView = NSBundle.mainBundle().loadNibNamed("DatePopUpView", owner: self, options: nil)[0] as? UIView

}

required init(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
      }

required override init(frame: CGRect) {
           super.init(frame: frame)

}

}

我在主视图中将其称为:

 @IBAction func date_button_pressed (sender : AnyObject?) {
 var popUpView = DatePopUpView()
 var centre : CGPoint = CGPoint(x: self.view.center.x, y: self.view.center.y)

    popUpView.center = centre
    popUpView.layer.cornerRadius = 10.0
  let trans = CGAffineTransformScale(popUpView.transform, 0.01, 0.01)
    popUpView.transform = trans
    self.view .addSubview(popUpView)
    UIView .animateWithDuration(0.5, delay: 0.0, options:     UIViewAnimationOptions.CurveEaseInOut, animations: {

        popUpView.transform = CGAffineTransformScale(popUpView.transform, 100.0, 100.0)

        }, completion: {
            (value: Bool) in

    })

 }

但是 popUp 不会出现。我使用了断点并注意到值被分配给我的 popUpView 但它仍然没有显示在我的主视图上。请帮忙

请注意:我将 StoryBoard 用于我的 mainView 和我使用 xib 制作的自定义视图。

【问题讨论】:

  • 你确定你的 date_button_pressed() 函数被调用了吗?
  • 好的,现在我怀疑你的观点了。
  • 你为什么不临时创建一个单独的项目。在主 vc 中加载你的 nib,看看你是否可以看到和调整你的视图。如果它看起来不错,那么我们可以重新审视这种情况
  • 我尝试提供框架并添加 var popUpView = DatePopUpView() popUpView.frame = CGRectMake(40, 40, 200, 200) self.view .addSubview(popUpView) 但没有成功

标签: ios iphone swift uiview


【解决方案1】:

尝试将您的视图修改为以下内容:

class DatePopUpView: UIView {
     var uiView:UIView?
     override init()  {
         super.init()
         self.setup()
     }
     required init(coder aDecoder: NSCoder)  {
         super.init(coder: aDecoder)
         self.setup()
     }
     override init(frame: CGRect)   {
         super.init(frame: frame)
         self.setup()
     }
     setup() {
         self.uiView = NSBundle.mainBundle().loadNibNamed("DatePopUpView", owner: self, options: nil)[0] as? UIView
         self.uiView.frame = self.bounds
         self.uiView.autoresizingMask = .FlexibleWidth | .FlexibleHeight
         self.addSubview(self.uiView)
     }
}

【讨论】:

    【解决方案2】:

    在故事板中

    • 在storyboard中创建一个UIViewController
    • 将自定义类设置为 anotherViewController 并将 Storyboard_ID 设置为 another_view_sid
    • 创建一个新的 Cocoa Touch 类作为 anotherViewController 和 UIVIewController 的子类

    在视图控制器中

        let popvc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "another_view_sid") as! anotherViewController
    
        self.addChildViewController(popvc)
    
        popvc.view.frame = self.view.frame
    
        self.view.addSubview(popvc.view)
    
        popvc.didMove(toParentViewController: self)
    

    在另一个视图控制器中

    override func viewDidLoad() {
        super.viewDidLoad()
            showAnimate()
        }
    }
    
    @IBAction func Close_popupView(_ sender: Any) {
        removeAnimate()
    }
    
    func showAnimate()
    {
        self.view.transform = CGAffineTransform(scaleX: 1.3, y: 1.3)
        self.view.alpha = 0.0
        UIView.animate(withDuration: 0.25, animations: {
            self.view.alpha = 1.0
            self.view.transform = CGAffineTransform(scaleX: 1.0, y: 1.0)
        })
    }
    
    func removeAnimate()
    {
        UIView.animate(withDuration: 0.25, animations: {
            self.view.transform = CGAffineTransform(scaleX: 1.3, y: 1.3)
            self.view.alpha = 0.0
        }, completion: {(finished : Bool) in
            if(finished)
            {
                self.willMove(toParentViewController: nil)
                self.view.removeFromSuperview()
                self.removeFromParentViewController()
            }
        })
    }
    

    【讨论】:

    • 这是动画代码,效果很好。但是,如何显示为像 alertview 这样的弹出窗口?
    【解决方案3】:

    将视图呈现为模态转场

    查看本教程:

    http://makeapppie.com/2014/08/30/the-swift-swift-tutorials-adding-modal-views-and-popovers/

    您可以使用系统提供的转场转场或进行自定义转场转场以获得真正精美的效果。

    这是制作自定义过渡动画师的一种方法:

    //
    //  BaseTransitionAnimator.swift
    //
    
    import UIKit
    
    class BaseTransitionAnimator : NSObject, UIViewControllerAnimatedTransitioning {
    
        enum PresentationMode {
            case Presenting, Dismissing
        }
        var duration     : NSTimeInterval = 1.0
        var mode         : PresentationMode = .Presenting
    
        init(duration: NSTimeInterval, mode: PresentationMode) {
            self.duration = duration
            self.mode = mode
        }
    
        func transitionDuration(transitionContext: UIViewControllerContextTransitioning) -> NSTimeInterval {
            return duration
        }
    
        func animateTransition(transitionContext: UIViewControllerContextTransitioning) {
            // stub - must be overriden by inheritor
        }
    

    //
    //  ExpandingTransitionAnimator.swift
    //
    
    import UIKit
    
    class ExpandingTransitionAnimator : BaseTransitionAnimator {
    
        enum ExpansionMode {
            case Basic, WithFadingImage
        }
    
        var image : UIImage? = nil
    
        override init(duration: NSTimeInterval, mode: PresentationMode) {
            super.init(duration: duration, mode: mode)
        }
    
        override func animateTransition(transitionContext: UIViewControllerContextTransitioning) {
            var fromVC             = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey)!
            var toVC               = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey)!
            var fromView           = fromVC.view
            var toView             = toVC.view
            var containerView      = transitionContext.containerView()
            var duration           = transitionDuration(transitionContext)
            var initialFrame       = transitionContext.initialFrameForViewController(fromVC)
    
            var imageView : UIImageView?
            if image != nil {
                imageView = UIImageView(image: image!.crop(CGPointMake(0, 0),  size: toView.frame.size))
    
            }
            if (mode == .Presenting) {  
                    toView.transform = CGAffineTransformMakeScale(0.05, 0.05)
                   var originalCenter = toView.center
                    containerView.addSubview(toView)
                    if imageView != nil {
                        imageView!.transform = CGAffineTransformMakeScale(0.05, 0.05);
                        containerView.addSubview(imageView!)
                    }
    
                    UIView.animateWithDuration(duration,
                        delay:0.0,
                        options:.CurveEaseInOut,
                        animations: {
                            if imageView != nil {
                                imageView!.alpha = 0.0
                                imageView!.transform =  CGAffineTransformMakeScale(1.0, 1.0)
                            }
                            toView.transform =  CGAffineTransformMakeScale(1.0, 1.0)
                            toView.center = originalCenter
                        },
                        completion: { _ in
                            transitionContext.completeTransition(!transitionContext.transitionWasCancelled())
                    })
            } else { // dismissing
                UIView.animateWithDuration(duration,
                    animations: {
                        fromView.transform = CGAffineTransformMakeScale(0.05, 0.05)
                        fromView.center = toView.center
                    },
                    completion: { _ in
                        fromView.removeFromSuperview()
                        transitionContext.completeTransition(!transitionContext.transitionWasCancelled())
                })
            }
        }
    }
    

    【讨论】:

    • 这意味着我应该创建一个 UIViewcontroller 并使用 suegue 以模态方式呈现它,而不是 UIView?
    • 该代码仅适用于 iPad。其中提到。我正在使用 iPhone
    【解决方案4】:

    在 DatePopUpView 中,您似乎正在加载 nib 文件,但实际上并未将其作为子视图添加到视图中。

    【讨论】:

      【解决方案5】:

      Mili Shah 回答的 Swift 5 版本

      let popvc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "another_view_sid") as! anotherViewController
      
      self.addChild(popvc)
      popvc.view.frame = self.view.frame
      self.view.addSubview(popvc.view)
      popvc.didMove(toParent: self)
      
      @IBAction func Close_popupView(_ sender: Any) {
          removeAnimate()
      }
      
      func showAnimate() {
          self.view.transform = CGAffineTransform(scaleX: 1.3, y: 1.3)
          self.view.alpha = 0.0
          UIView.animate(withDuration: 0.25, animations: {
              self.view.alpha = 1.0
              self.view.transform = CGAffineTransform(scaleX: 1.0, y: 1.0)
          })
      }
      
      func removeAnimate() {
          UIView.animate(withDuration: 0.25, animations: {
              self.view.transform = CGAffineTransform(scaleX: 1.3, y: 1.3)
              self.view.alpha = 0.0
          }, completion: {(finished : Bool) in
              if(finished)
              {
                  self.willMove(toParent: nil)
                  self.view.removeFromSuperview()
                  self.removeFromParent()
              }
          })
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-13
        • 2021-12-15
        • 1970-01-01
        相关资源
        最近更新 更多