Swift 4为UIView添加自定义圆形

我在一个名为Zenly的显然相当着名的应用程序中找到了一个很棒的设计,他们使用屏幕底部的视图为用户体验添加额外的内容。 我需要一个与此非常相似的视图。 不幸的是,我根本不知道如何获得视图顶部的圆形形状。 我该怎么办? 这是一个截图。

Zenly截图

hum eu ..,我对IOS很新,但我认为你可以使用Constraints动画,UIGestureRecogniser和(view.layer.cornerRadius)让我试试。

好吧,让我们明星吧?

首先,结果如下: https : //streamable.com/cv91a

  • 首先在网站上获得2个图标https://www.flaticon.com/
  • 现在打开Xcode并创建一个新项目作为单个View应用程序
  • 现在在属性检查器上搜索“ MAP KIT VIEW ”并将其添加到屏幕的一半

    看这里的截图

  • 现在仍然在属性检查器中搜索“ 视图 ”然后放置它以使其一部分 MAP KIT VIEW 重叠 ,然后将其颜色设置为所需的颜色(如果您想要与图片上的颜色相同的颜色,请使用colorPicker图标并从图像中选择该颜色)

    看这里的截图

  • 一旦完成,将限制放在“ 地图套件视图 ”和“ 蓝色视图 ”上(在蓝色视图上,您必须确保从屏幕顶部放置约束(请参阅您将理解的图片))

    看这里的截图

  • 现在将BlueView连接到ViewController.swift作为UIView! 并将顶部约束连接到代码(查看我之前的图像)

  • 现在按照您提供的图像添加按钮,标签,并在viewController.swift中连接所有这些按钮

  • 现在让我解释一下我们将从这里应用的逻辑

    1)我们将设置BlueView的角和具有各自图层的“ cornerRadius ”属性的按钮

    2)我们将使用uiSwipeGestureRecogniser来识别在蓝色上向上和向下滑动,然后相应地采取行动

    3)我们将在每次检测到更改时为视图设置动画(实际上我们将动画我们之前连接到代码的顶部约束)

在我们继续之前注意: IOS中的动画是你应该知道的另一个概念,如果你不知道动画,你仍然可以跟随我,但在本教程结束时,我建议你继续使用https: //www.raywenderlich.com/category/ios然后搜索动画的基础知识。

  • 现在让我们继续故事板:在属性检查器上搜索“ Swipe Gesture Recognizer ”并在蓝色视图上拖动它2次以便在它上面有2个手势

  • 将第一个Swipe Gesture Recognizer重命名为SwipeUpGestureRecognizer,将另一个重命名为SwipeDownGestureRecognizer

  • 现在是不容错过的棘手部分:你必须将gestureRecognizer委托设置为BlueView(参见图片,大多数时候你只需拖动并选择委托)

    看这里的截图

  • 现在将2个gestureRecognizers连接到viewController.swift作为@IBAction你会得到这样的东西:

@IBAction func SwipeDownGestureRecogniser(_ sender:Any){}

@IBAction func SwipeupGestureRecognizer(_ sender:Any){}

  • 现在是时候让我们在图片中看到角落:为此我们将使用图层属性并更改它们的角半径,我们在viewDidLoad上进行。 这是代码:

     override func viewDidLoad() { super.viewDidLoad() BlueViewOutlet.layer.cornerRadius = 40 getDirectionButton.layer.cornerRadius = 30 view.layoutIfNeeded() } 
  • 现在在这两个函数中添加此代码,并确保constraint.constant的值不同

     @IBAction func SwipeDownGestureRecogniser(_ sender: Any) { UIView.animate(withDuration: 0.9, delay: 0.0, usingSpringWithDamping: 0.0, initialSpringVelocity: 0.0, options: .curveEaseOut, animations: { self.view.layoutIfNeeded() self.BlueViewOutlet.layoutIfNeeded() self.BlueViewVerticalConstraint.constant = 357 // this value depends on the constraint you have set , most of the time before putting this value i identify the device i'm running on and i set different values depending on the type of the screen but here we suppose that we are just on the iPhoneX so i use raw values self.view.layoutIfNeeded() }, completion: nil) } 
  • 一些解释 :Uiview.animate(_)用于在IOS中为元素(uiViews,uiButton等…)制作动画; 正如我之前所说,有很多类型的动画。 在这里,我们将使用我们所谓的“Spring Animation”; 代码是不言自明的,参数选项是一个行为的枚举(我猜它就像那样),在这里我使用“.curveEaseOut”然后在闭包内(动画之后是什么)我使用了self.view.layoutIfNeeded ()使动画能够顺利运行,没有它你将会有一个奇怪的行为

  • 这是我的完整代码

    导入UIKit

     class ViewController: UIViewController { @IBOutlet weak var BlueViewOutlet: UIView! @IBOutlet weak var BlueViewVerticalConstraint: NSLayoutConstraint! // on my computer the value of its constant is 307 , you can see it from the attribute inspector @IBOutlet weak var getDirectionButton: UIButton! override func viewDidLoad() { super.viewDidLoad() BlueViewOutlet.layer.cornerRadius = 40 getDirectionButton.layer.cornerRadius = 30 view.layoutIfNeeded() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } @IBAction func SwipeDownGestureRecogniser(_ sender: Any) { UIView.animate(withDuration: 0.9, delay: 0.0, usingSpringWithDamping: 0.0, initialSpringVelocity: 0.0, options: .curveEaseOut, animations: { self.view.layoutIfNeeded() self.BlueViewOutlet.layoutIfNeeded() self.BlueViewVerticalConstraint.constant = 357 self.view.layoutIfNeeded() }, completion: nil) } @IBAction func SwipeupGestureRecognizer(_ sender: Any) { self.view.layoutIfNeeded() UIView.animate(withDuration: 0.9, delay: 0.0, usingSpringWithDamping: 0.0, initialSpringVelocity: 0.0, options: .curveEaseOut, animations: { self.view.layoutIfNeeded() self.BlueViewOutlet.layoutIfNeeded() self.BlueViewVerticalConstraint.constant = 257 self.view.layoutIfNeeded() }, completion: nil) } } 
  • 我猜这就是你要做的一切。 我很抱歉如果它不是很好,我还是太新了教程,解释和快速,所以我希望我足够清楚。 这是一段videohttps://streamable.com/cv91a (再次)。

    请注意,这不是一个完美的工作,只是我要解释的东西,你必须根据自己的需要定制它,并自己润色其他一切

至于自定义顶部圆角我建议你在Photoshop或草图设计它然后使用我在这里发布的教程,但你只需要将“blueView UiViuew”更改为一个大的UIimageView然后将你的图像作为背景