检测关于容器视图的 UIView 中心位置 - Swift - 以编程方式

Posted

技术标签:

【中文标题】检测关于容器视图的 UIView 中心位置 - Swift - 以编程方式【英文标题】:detect UIView center position in regards to container View - Swift - Programmatically 【发布时间】:2020-08-31 12:50:51 【问题描述】:

我在 ViewController 视图上添加了一个 UIView 卡:

self.view.addSubview(cardView)
cardView.anchor(top: self.topWhiteView.bottomAnchor, leading: view.leadingAnchor, bottom: buttonsStackView.topAnchor, trailing: view.trailingAnchor, padding: .init(top: 15, left: 10, bottom: 10, right: 10))

我在上面添加了一个 panGestureRecogniser,我可以用它来拖动卡片。 pan 方法:

@objc func handlePan(gesture : UIPanGestureRecognizer)
    
    
    switch gesture.state 
    case .changed:
        handleChanged(gesture)
    case .ended:
        handleEnded(gesture)
    default:
        ()
    
    
    



fileprivate func handleChanged(_ gesture: UIPanGestureRecognizer) 
    
    
    let translationY = gesture.translation(in: nil).y
    var scaleValue : CGFloat = 1
    let multiplier = 1.1*translationY
    if translationY != 0 
        scaleValue = 1 - (abs(translationY*multiplier)/abs(translationY)/3000)
    


    let scale = CGAffineTransform(scaleX: scaleValue, y: scaleValue)

    let translation = gesture.translation(in: nil)
    let rotationRadiant: CGFloat = translation.x / 20
    let rotationDegree = (rotationRadiant * .pi) / 180
    let rotationalTransformation = CGAffineTransform(rotationAngle: rotationDegree)
    self.transform = rotationalTransformation.translatedBy(x: translation.x, y: translation.y).concatenating(scale)
    
    
   


fileprivate func handleEnded(_ gesture: UIPanGestureRecognizer) 
    
    UIView.animate(withDuration: 0.6, delay: 0, usingSpringWithDamping: 0.6, initialSpringVelocity: 0.1, options: [.curveEaseOut, .allowUserInteraction], animations: 
        
        self.transform = CGAffineTransform.identity
        
    )

我想知道卡片移动时如何检测cardView的中心位置。

但与其他 Stack Overflow 问题不同,我想在 cardView 类中进行,而不使用任何委托。

【问题讨论】:

【参考方案1】:

不确定我是否完全理解您的需求,但请尝试以下操作

class CardView: UIView 
    override var center: CGPoint 
        get  super.center 
        set 
            super.center = newValue
            didMove(to: newValue)
        
    

    private func didMove(to point: CGPoint) 
        // do anything needed with new position
    

【讨论】:

以上是关于检测关于容器视图的 UIView 中心位置 - Swift - 以编程方式的主要内容,如果未能解决你的问题,请参考以下文章

将 MPMoviePlayerController 视图置于 UIview 的中心(相同位置)

使用 XIB 将 UIView 移动到其他视图内部时保持位置

尽管 Superview 的位置,但将 UIView 居中在 MainScreen 的中心

iOS 模糊文本:一劳永逸地检测和解决它?

如果检测到超出范围,则禁用平移手势

如何使第一行标签位于另一个 UIView 的同一中心位置