【问题标题】:How can I replicate Apple Maps App UIButtons?如何复制 Apple Maps App UIButtons?
【发布时间】:2021-03-29 08:14:06
【问题描述】:

我想让按钮看起来像这样:

有人知道如何在 Swift 中制作像这样的按钮吗? (特别是上面的那个,你在一帧中有 2 或 3 个按钮,用细线分隔)。

谢谢!!!

【问题讨论】:

    标签: ios swift uibutton mapkit mkmapview


    【解决方案1】:

    幸运的是,所有图像都存在于 SF Symbols 中,因此不必从头开始绘制。

    您可以创建自定义视图:

    class CustomView: UIImageView {
        init(frame: CGRect, corners: CACornerMask, systemName: String) {
            super.init(frame: frame)
            self.createBorders(corners: corners)
            self.createImage(systemName: systemName)
        }
        
        required init?(coder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }
        
        func createBorders(corners: CACornerMask) {
            self.contentMode = .scaleAspectFill
            self.clipsToBounds = false
            self.layer.cornerRadius = 20
            self.layer.maskedCorners = corners
            self.layer.masksToBounds = false
            self.layer.shadowOffset = .zero
            self.layer.shadowColor = UIColor.gray.cgColor
            self.layer.shadowRadius = 20
            self.layer.shadowOpacity = 0.2
            self.backgroundColor = .white
            let shadowAmount: CGFloat = 2
            let rect = CGRect(x: 0, y: 2, width: self.bounds.width + shadowAmount * 0.1, height: self.bounds.height + shadowAmount * 0.1)
            self.layer.shadowPath = UIBezierPath(rect: rect).cgPath
    
        }
        
        func createImage(systemName: String) {
            let image = UIImage(systemName: systemName)!
            let renderer = UIGraphicsImageRenderer(bounds: self.frame)
            let renderedImage = renderer.image { (_) in
                image.draw(in: frame.insetBy(dx: 30, dy: 30))
            }
            self.image = renderedImage.withRenderingMode(.alwaysTemplate)
        }
    }
    

    并像这样使用它:

    let size = CGSize(width: 100, height: 100)
    let frame = CGRect(origin: CGPoint(x: 100, y: 100), size: size)
    
    let infoView = CustomView(frame: frame, corners: [.layerMinXMinYCorner, .layerMaxXMinYCorner], systemName: "info.circle")
    let locationView = CustomView(frame: frame, corners: [], systemName: "location")
    let twoDView = CustomView(frame: frame, corners: [.layerMinXMaxYCorner, .layerMaxXMaxYCorner], systemName: "view.2d")
    let binocularsView = CustomView(frame: frame, corners: [.layerMinXMinYCorner, .layerMinXMaxYCorner, .layerMaxXMinYCorner, .layerMaxXMaxYCorner], systemName: "binoculars.fill")
    
    let stackView = UIStackView(arrangedSubviews: [infoView, locationView, twoDView, binocularsView])
    stackView.frame = CGRect(origin: CGPoint(x: 100, y: 100), size: CGSize(width: 100, height: 400))
    stackView.distribution = .fillEqually
    stackView.axis = .vertical
    stackView.setCustomSpacing(20, after: twoDView)
    view.addSubview(stackView)
    

    【讨论】:

    • 如何在图标之间画出细线?
    • 而且图像看起来有点失真,我该如何保持纵横比?尝试使用“contentMode”但不工作
    【解决方案2】:

    创建视图和遮罩角

    yourView.layer.maskedCorners = [.layerMaxXMaxYCorner, .layerMinXMaxYCorner] // this is horizontal , you can change for vertical
    

    在其中放置一个堆栈视图,并用按钮填充它,给它们间距 0,就是这样

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      相关资源
      最近更新 更多