我正在尝试将矩形形状(如图所示的曲线)添加到我现有的UIView中。
这是我实施的代码:
func drawRect(rect: CGRect) {
let y:CGFloat = 20
let curveTo:CGFloat = 0
let myBezier = UIBezierPath()
myBezier.move(to: CGPoint(x: 0, y: y))
myBezier.addQuadCurve(to: CGPoint(x: rect.width, y: y), controlPoint: CGPoint(x: rect.width / 2, y: curveTo))
myBezier.addLine(to: CGPoint(x: rect.width, y: rect.height))
myBezier.addLine(to: CGPoint(x: 0, y: rect.height))
myBezier.close()
let context = UIGraphicsGetCurrentContext()
context!.setLineWidth(4.0)
UIColor.yellow.setFill()
myBezier.fill()
}
只是试着让一个矩形路径出现,但是,当我在模拟器中打开它时什么都没有。我相信这是因为我的其他元素叠加在它上面这是正确的吗?我的完整代码是here
感谢您的帮助。
答案 0 :(得分:0)
查看你的代码。 UIViewController没有覆盖消息drawRect。您应该创建从UIView派生的自定义类,并在那里覆盖消息drawRect。
答案 1 :(得分:0)
这可以更加灵活,但它可能适合您的需求。如果它没有,那么它可能是你达到你想要的一个很好的起点。
如果您没有查看自定义组件/使用IBInspectable和IBDesignable对UIView进行子类化,这可能没有多大意义,所以您可能需要阅读一些内容:)
//
// RoundedBottomImageView.swift
// SW3IBDesign
//
// Created by Don Mag on 2/27/17.
// Copyright © 2017 DonMag. All rights reserved.
//
import UIKit
@IBDesignable
class RoundedBottomImageView: UIView {
var imageView: UIImageView!
@IBInspectable var image: UIImage? {
didSet { self.imageView.image = image }
}
@IBInspectable var roundingValue: CGFloat = 0.0 {
didSet {
self.setNeedsLayout()
}
}
override init(frame: CGRect) {
super.init(frame: frame)
doMyInit()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
doMyInit()
}
func doMyInit() {
imageView = UIImageView()
imageView.backgroundColor = UIColor.red
imageView.contentMode = UIViewContentMode.scaleToFill
addSubview(imageView)
}
override func layoutSubviews() {
super.layoutSubviews()
imageView.frame = self.bounds
let rect = self.bounds
let y:CGFloat = rect.size.height - roundingValue
let curveTo:CGFloat = rect.size.height
let myBezier = UIBezierPath()
myBezier.move(to: CGPoint(x: 0, y: y))
myBezier.addQuadCurve(to: CGPoint(x: rect.width, y: y), controlPoint: CGPoint(x: rect.width / 2, y: curveTo))
myBezier.addLine(to: CGPoint(x: rect.width, y: 0))
myBezier.addLine(to: CGPoint(x: 0, y: 0))
myBezier.close()
let maskForPath = CAShapeLayer()
maskForPath.path = myBezier.cgPath
layer.mask = maskForPath
}
}
示例应用:https://github.com/DonMag/IBDesignInspect
编辑:示例现在包含用于演示通过代码更改图像的按钮。
Edit2:示例应用程序现在有一个备用故事板,以显示图像如何"路径剪辑"不使用自定义子类。