Мне интересно, видите ли вы что-то, чего нет у нас ...
Вот конец строки, ширина 8 пт (которая отображается в 16 пикселях на iPhone 8), увеличеннаядо 3200%
Как видите, закругленная торцевая крышка имеет радиус точно 8 пикселей.
А вот фактическая крышка экрана, которую я использовал, чтобы получить увеличенное изображение выше. Ширина линий варьируется от 1 до 10:
РЕДАКТИРОВАТЬ
Хммм .. Кажется, что либо A) Он оптический, и вы не учитываете все сглаженные пиксели в ваших увеличенных изображениях (то есть, когда заглушка равна , онапросто не выглядит вокруг вас) или B) Может быть, вы масштабируете / растягиваете свое изображение / слои?
Вот еще пара примеров изображений- на этот раз я использую CAShapeLayer
в качестве маски для CAGradientLayer
, наложенного на UIImageView
:
Крышка экрана, используемая для увеличенных изображений:
И источник для создания этого представления,если вы хотите поиграть с ним:
class GradientView: UIView {
override open class var layerClass: AnyClass {
return CAGradientLayer.classForCoder()
}
lazy var gradientLayer: CAGradientLayer = {
return self.layer as! CAGradientLayer
}()
override init(frame: CGRect) {
super.init(frame: frame)
commonInit()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
commonInit()
}
func commonInit() -> Void {
if let l = layer as? CAGradientLayer {
let c1 = UIColor(rgb: 0x6119D2)
let c2 = UIColor(rgb: 0x7E1CC6)
l.colors = [c1.cgColor, c2.cgColor]
l.startPoint = CGPoint(x: 0.0, y: 0.0)
l.endPoint = CGPoint(x: 1.0, y: 0.0)
}
}
override func layoutSubviews() {
super.layoutSubviews()
let l = CAShapeLayer()
let bez = UIBezierPath()
let xOffset = bounds.size.height * 0.5 + 4
bez.move(to: CGPoint(x: xOffset, y: bounds.size.height * 0.5))
bez.addLine(to: CGPoint(x: bounds.size.width - xOffset, y: bounds.size.height * 0.5))
l.lineCap = .round
l.lineWidth = bounds.size.height
l.strokeColor = UIColor.black.cgColor
l.path = bez.cgPath
self.layer.mask = l
}
}
class EndCapViewController: UIViewController {
let gView: GradientView = {
let v = GradientView()
v.translatesAutoresizingMaskIntoConstraints = false
return v
}()
let imgView: UIImageView = {
let v = UIImageView()
v.translatesAutoresizingMaskIntoConstraints = false
v.contentMode = .scaleAspectFit
return v
}()
override func viewDidLoad() {
super.viewDidLoad()
if let img = UIImage(named: "clouds") {
imgView.image = img
}
view.addSubview(imgView)
view.addSubview(gView)
let lineThickness: CGFloat = 8.0
NSLayoutConstraint.activate([
imgView.centerXAnchor.constraint(equalTo: view.centerXAnchor),
imgView.centerYAnchor.constraint(equalTo: view.centerYAnchor),
imgView.widthAnchor.constraint(equalToConstant: 128.0),
imgView.heightAnchor.constraint(equalTo: imgView.widthAnchor, multiplier: 1.0),
gView.widthAnchor.constraint(equalTo: imgView.widthAnchor, multiplier: 1.0),
gView.heightAnchor.constraint(equalToConstant: lineThickness),
gView.centerXAnchor.constraint(equalTo: imgView.centerXAnchor),
gView.centerYAnchor.constraint(equalTo: imgView.centerYAnchor),
])
}
}
extension UIColor {
convenience init(red: Int, green: Int, blue: Int) {
assert(red >= 0 && red <= 255, "Invalid red component")
assert(green >= 0 && green <= 255, "Invalid green component")
assert(blue >= 0 && blue <= 255, "Invalid blue component")
self.init(red: CGFloat(red) / 255.0, green: CGFloat(green) / 255.0, blue: CGFloat(blue) / 255.0, alpha: 1.0)
}
convenience init(rgb: Int) {
self.init(
red: (rgb >> 16) & 0xFF,
green: (rgb >> 8) & 0xFF,
blue: rgb & 0xFF
)
}
}