実現したい事
お世話になります。UIImageViewを三角形で表示させたいのですが、
インターネットで調べてみてもほとんど見当たらずこちらで知恵を借りたく質問しましたm(_ _)m
現状・分からない事
関連でUIImageViewを三角形で表示するのに近い物として、
UIButtonを三角形にするという記事とUIImageViewを丸くするという記事を参考に
UIViewを三角形にすることとUIImageViewの変形までは実現することができたのですが、
二つのコードは違う書き方なのでUIImageViewを三角形に落とし込むところまでの方法が分からない状態です。
アドバイスやご指摘、お待ちしておりますm(_ _)m
シミュレーター実行画面
(犬の写真がUIImageViewを丸くしたもので下の三角形はUIViewを三角形にしたものです)
以下がUIViewを三角形にしたコードになります。
Swift4
1import UIKit 2 3class CustomView: UIView { 4 5 override init(frame: CGRect) { 6 super.init(frame: frame) 7 } 8 9 required init?(coder aDecoder: NSCoder) { 10 super.init(coder: aDecoder) 11 drawTriangle() 12 } 13 14 private func drawTriangle() { 15 let path = createTrianglePath() 16 17 let mask = CAShapeLayer() 18 mask.path = path.cgPath 19 20 self.layer.masksToBounds = true 21 self.layer.mask = mask 22 23 let borderShape = CAShapeLayer() 24 borderShape.path = path.cgPath 25 borderShape.lineWidth = 4.0 26 borderShape.strokeColor = UIColor.darkGray.cgColor 27 borderShape.fillColor = UIColor.clear.cgColor 28 self.layer.insertSublayer(borderShape, at: 0) 29 30 backgroundColor = .cyan 31 } 32 33 private func createTrianglePath() -> UIBezierPath { 34 let rect = self.frame 35 let path = UIBezierPath() 36 path.move(to: CGPoint(x:rect.width, y:0)) 37 path.addLine(to: CGPoint(x:rect.width, y:rect.height)) 38 path.addLine(to: CGPoint(x:0, y:rect.height)) 39 path.close() 40 return path 41 } 42 43}
以下がUIImageViewを丸くしたコードになります。
Swift4
1import UIKit 2 3class CircleImageView: UIImageView { 4 5 override func awakeFromNib() { 6 super.awakeFromNib() 7 // swap UIImage because you can't asign yourself. 8 let image = self.image 9 self.image = image 10 } 11 12 override var image: UIImage? { 13 get { return super.image } 14 set { 15 self.contentMode = .scaleAspectFit 16 super.image = newValue?.roundImage() 17 } 18 } 19 20 override func layoutSubviews() { 21 super.layoutSubviews() 22 self.layer.cornerRadius = self.frame.height / 2.0 23 } 24 } 25 26 extension UIImage { 27 func roundImage() -> UIImage { 28 29 let minLength: CGFloat = min(self.size.width, self.size.height) 30 let rectangleSize: CGSize = CGSize(width: minLength, height: minLength) 31 UIGraphicsBeginImageContextWithOptions(rectangleSize, false, 0.0) 32 33 UIBezierPath(roundedRect: CGRect(origin: .zero, size: rectangleSize), cornerRadius: minLength).addClip() 34 self.draw(in: CGRect(origin: CGPoint(x: (minLength - self.size.width) / 2, y: (minLength - self.size.height) / 2), size: self.size)) 35 36 let newImage = UIGraphicsGetImageFromCurrentImageContext()! 37 UIGraphicsEndImageContext() 38 return newImage 39 } 40 41}
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。