更新 UIView 会产生子视图对齐/Swift 的散列

Posted

技术标签:

【中文标题】更新 UIView 会产生子视图对齐/Swift 的散列【英文标题】:Updating UIView makes a hash of subview's alignment / Swift 【发布时间】:2015-06-30 18:27:55 【问题描述】:

我是 Swift 的新手。我想制作一个带有移动子视图的应用程序。我正在测试应用程序,当我按下按钮时,子视图以正确的值移动,但是当父 UIView 由于更改标签而更新时,子视图跳回我在情节提要中设置的原点坐标。我用核心图形画圆。我想通过点击一个按钮来移动屏幕上的圆圈。我该如何解决这个问题?

    class ViewController: UIViewController 

          @IBOutlet weak var movingItem: MovingItem! /* inheritance from UIView */ 

          @IBAction func move() 

              self.movingItem.frame = CGRect(x: movingItem.frame.origin.x + 5.0, 
                                            y: movingItem.frame.origin.y, 
                                            width: movingItem.frame.width, 
                                            height: movingItem.frame.height)
         

         override func viewDidLoad() 

              self.movingItem.frame = CGRect(x: 0.0, y: 0.0, width: 50.0, height: 50.0)
              self.movingItem.setNeedsDisplay()
         

//more code...

    



@IBDesignable
class MovingItem: UIView 

    override func drawRect(rect: CGRect) 

        var context = UIGraphicsGetCurrentContext()
        CGContextBeginPath(context)

        var rectForCircle = CGRect(x: 0.0, y: 0.0, width: 50.0, height: 50.0)
        CGContextAddEllipseInRect(context, rectForCircle)

        UIColor.redColor().setFill()
        CGContextDrawPath(context, kCGPathFill)

    


【问题讨论】:

【参考方案1】:

尝试代替

var rectForCircle = CGRect(x: 0.0, y: 0.0, width: 50.0, height: 50.0)
CGContextAddEllipseInRect(context, rectForCircle)

像这样:

CGContextAddEllipseInRect(context, self.frame)

并插入行

self.movingItem.setNeedsDisplay()

之后

self.movingItem.frame = CGRect(x: movingItem.frame.origin.x + 5.0, 
                                            y: movingItem.frame.origin.y, 
                                            width: movingItem.frame.width, 
                                            height: movingItem.frame.height)

【讨论】:

问题是一样的。当主 UIView 更新时,包含圆圈的子视图会跳回来。在 2 次更新之间,子视图正确移动,但是当 uiview 更新时,uiview 包含的子视图跳回原点坐标。顺便说一句,谢谢!

以上是关于更新 UIView 会产生子视图对齐/Swift 的散列的主要内容,如果未能解决你的问题,请参考以下文章

使用 Swift 以编程方式将 UIView 中的标签和图像居中对齐

Swift UIView 从堆栈视图中消失

Swift:将视图 X 点从中心对齐到后缘

如何在 Swift 4 中向 UIView 添加子视图?

swift [添加子视图和填充]添加子视图并填写#tags:uiview

无法设置 UIView 的 backgroundColor,它是 Swift 中 UIScrollView 的子视图