Альтернативное решение, использующее метод .query () :
In [5]: df.query("countries in @countries")
Out[5]:
countries
1 UK
3 China
In [6]: df.query("countries not in @countries")
Out[6]:
countries
0 US
2 Germany
Редактировать
Я хочу установить границу слева направо
Вам нужно изменить gradient.startPoint и gradient.endPoint
enum Direction { case horizontal case vertical } class View: UIView { init(frame: CGRect, cornerRadius: CGFloat, colors: [UIColor], lineWidth: CGFloat = 5, direction: Direction = .horizontal) { super.init(frame: frame) self.layer.cornerRadius = cornerRadius self.layer.masksToBounds = true let gradient = CAGradientLayer() gradient.frame = CGRect(origin: CGPoint.zero, size: self.frame.size) gradient.colors = colors.map({ (color) -> CGColor in color.cgColor }) switch direction { case .horizontal: gradient.startPoint = CGPoint(x: 0, y: 1) gradient.endPoint = CGPoint(x: 1, y: 1) case .vertical: gradient.startPoint = CGPoint(x: 0, y: 0) gradient.endPoint = CGPoint(x: 0, y: 1) } let shape = CAShapeLayer() shape.lineWidth = lineWidth shape.path = UIBezierPath(roundedRect: self.bounds.insetBy(dx: lineWidth, dy: lineWidth), cornerRadius: cornerRadius).cgPath shape.strokeColor = UIColor.black.cgColor shape.fillColor = UIColor.clear.cgColor gradient.mask = shape self.layer.addSublayer(gradient) } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") }
Как вы можете видеть, я добавил некоторые дополнительные параметры. Я решил эту проблему, добавив в нее roundedRect:
shape.path = UIBezierPath(roundedRect: self.bounds.insetBy(dx: lineWidth, dy: lineWidth), cornerRadius: cornerRadius).cgPath
Как ее использовать:
let myView = View(frame: CGRect(x: 0, y: 0, width: 200, height: 50), cornerRadius: 25, colors: [UIColor.red, .orange, .yellow], lineWidth: 2, direction: .horizontal) myView.center = view.center view.addSubview(myView)
Снимок экрана:
Проблема заключается в том, что путь безье не нарисован внутри его границ. Он тянется вокруг его границ. Таким образом, половина ширины хода внутри и половина снаружи. Вы должны настроить границы, чтобы справиться с этим.
Измените кадр, который вы передаете в путь безье от self.bounds
до self.bounds.insetBy(dx: 5, dy: 5)
, где 5
- половина вашей ширины линии.
И строки:
gradient.startPoint = CGPoint(x: 0.0, y: 0.5)
gradient.endPoint = CGPoint(x: 1.0, y: 0.5)
приводят к тому, что градиент идет слева направо.
Здесь полностью работает код из вашего:
class View: UIView {
override func layoutSubviews() {
super.layoutSubviews()
let path = UIBezierPath(roundedRect: self.bounds.insetBy(dx: 5, dy: 5), byRoundingCorners: [.topLeft, .bottomLeft, .topRight, .bottomRight], cornerRadii: CGSize(width: frame.size.height / 2, height: frame.size.height / 2))
let gradient = CAGradientLayer()
gradient.frame = CGRect(origin: CGPoint.zero, size: frame.size)
gradient.startPoint = CGPoint(x: 0.0, y: 0.5)
gradient.endPoint = CGPoint(x: 1.0, y: 0.5)
gradient.colors = [UIColor.green.cgColor, UIColor.red.cgColor]
let shape = CAShapeLayer()
shape.lineWidth = 10
shape.path = path.cgPath
shape.strokeColor = UIColor.black.cgColor
shape.fillColor = UIColor.clear.cgColor
gradient.mask = shape
layer.insertSublayer(gradient, at: 0)
}
}
View
, в результате получится овал с зеленым слева и красный справа.
– rmaddy
14 July 2018 в 12:14