在 Swift 中仅平滑顶部角度和图像视图

Posted

技术标签:

【中文标题】在 Swift 中仅平滑顶部角度和图像视图【英文标题】:Smooth only top angles and imageview in Swift 【发布时间】:2016-06-08 21:50:16 【问题描述】:

我正在尝试仅舍入视图和图像视图的顶部顶角(TopLeft 和 TopRight)。使用下面的代码,我只能将左角四舍五入(尽管也指定了 TopRight)。也许他没有看到故事板上的约束。

我该如何解决?

谢谢。

let rectShape = CAShapeLayer()
        rectShape.bounds = self.CopertinaImage1.frame
        rectShape.position = self.CopertinaImage1.center
        rectShape.path = UIBezierPath(roundedRect: self.CopertinaImage1.bounds, byRoundingCorners: [.TopRight, .TopLeft], cornerRadii: CGSize(width: 10, height: 10)).CGPath

        self.CopertinaImage1.layer.backgroundColor = UIColor.greenColor().CGColor
        self.CopertinaImage1.layer.mask = rectShape

右上角总是一样的: 编辑:

我尝试将以下代码放入viewDidLayoutSubviews

override func viewDidLayoutSubviews()  
    super.viewDidLayoutSubviews() 
    let rectShape = CAShapeLayer() 
    rectShape.bounds = self.CopertinaImage1.frame 
    rectShape.position = self.CopertinaImage1.center 
    rectShape.path = UIBezierPath(roundedRect: self.CopertinaImage1.bounds, byRoundingCorners: [.TopRight, .TopLeft], cornerRadii: CGSize(width: 10, height: 10)).CGPath 
    self.CopertinaImage1.layer.backgroundColor = UIColor.greenColor().CGColor 
    self.CopertinaImage1.layer.mask = rectShape

但是没有用。

【问题讨论】:

如果以前使用自动布局,您需要将代码移动到自动布局引擎完成设置视图框架之后。如果您在 UIViewController 中执行此操作,则可能是 viewDidLayoutSubviews 试过了但是不行 我在viewDidLoad下输入了 override func viewDidLayoutSubviews() super.viewDidLayoutSubviews() let rectShape = CAShapeLayer() rectShape.bounds = self.CopertinaImage1.frame rectShape.position = self.CopertinaImage1.center rectShape.path = UIBezierPath(roundedRect: self.CopertinaImage1.bounds, byRoundingCorners: [.TopRight, .TopLeft],cornerRadii: CGSize(width: 10, height: 10)).CGPath self.CopertinaImage1.layer. backgroundColor = UIColor.greenColor().CGColor self.CopertinaImage1.layer.mask = rectShape 您试图在UITableViewCell 子类中屏蔽的视图?如果是这样,代码应该在它的layoutSubviews 中。 rectShape.bounds = self.CopertinaImage1.framerectShape.position = self.CopertinaImage1.center 在我看来也是错误的。我会尝试用rectShape.frame = self.CopertinaImage1.bounds 替换它们 没有@beyowulf。我试图通过放置 rectShape.frame = self.CopertinaImage1.bounds 来删除 rectShape.bounds = self.CopertinaImage1.frame 和 rectShape.position = self.CopertinaImage1.center 但它不起作用。 :( 这不是表格视图。在视图控制器中,我插入了一个内部(中间)一个 ImageView 的视图。 【参考方案1】:

我已经尝试过您发布的代码。无论出于何种原因,当我输入您的约束并重新创建您的视图层次结构时,自动布局引擎在第二次通过后不会调用viewDidLayoutSubviews。我可以强制它但从viewWillAppear 调用self.view.layoutIfNeeded()。例如:

override func viewDidLayoutSubviews() 
        super.viewDidLayoutSubviews()
        let rectShape = CAShapeLayer()
        rectShape.frame = self.imageView.bounds
        rectShape.path = UIBezierPath(roundedRect: self.imageView.bounds, byRoundingCorners: [.TopRight, .TopLeft], cornerRadii: CGSize(width: 10, height: 10)).CGPath
        self.imageView.layer.backgroundColor = UIColor.greenColor().CGColor
        self.imageView.layer.mask = rectShape


override func viewWillAppear(animated: Bool) 
        super.viewWillAppear(animated)
        self.view.layoutIfNeeded()
    

结果:

两个角都是圆形的。

我想说一个更好、更优雅的解决方案可以避免这种自动布局故障,即只设置图像视图容器的角半径,因为无论如何你都在做这件事。例如:

override func viewDidLoad() 
        super.viewDidLoad()
        self.imageView.clipsToBounds = true
        self.imageContainerView.layer.cornerRadius = 10.0
        self.imageContainerView.layer.masksToBounds = true
    

您也可以从 viewDidLoad 执行此操作,因为它不依赖于您设置的任何视图框架。

【讨论】:

【参考方案2】:

我刚刚在操场上尝试了您的代码。对我来说工作得很好。也许我误解了这个问题。

【讨论】:

这里也一样。在操场工作。右上角是否有可能被某些容器视图截断? 我看到右上角总是一样的。看这里->dl.dropboxusercontent.com/u/22334399/…

以上是关于在 Swift 中仅平滑顶部角度和图像视图的主要内容,如果未能解决你的问题,请参考以下文章

使用 url 图像平滑滚动的表格视图

如何在Android中旋转位图,使图像中心平滑,无振荡运动

使用平移手势平滑地更改动画约束

Swift3 淡入/淡出或平滑过渡 UIImageView animationImages

iOS:用于平滑滚动和轻弹视图的手势识别器

openCV:图像的平滑去噪