在CGAffineTransformRotate之后,CGRectIntersection无效

时间:2016-02-23 08:15:21

标签: ios swift uiview rotation uipangesturerecognizer

首先,我已经通过互联网检查了几乎每个地方,但我没有得到关于这个主题的任何解决方案。

在我的情况下,我在superview中有多个UIView对象,或者你可以说我在绘制这些视图的画布。

  1. 所有这些视图都附有平移手势,因此可以将它们移动到超级视图的任何位置。

  2. 可以使用旋转手势或CGAffineTransformRotate旋转部分视图。

    1. 每当任何视图都在主视图之外时,它将被删除。
  3. 以下是我的代码。

    @IBOutlet weak var mainView: UIView!
    
      var newViewToAdd = UIView()
      newViewToAdd.layer.masksToBounds = true
      var transForm = CGAffineTransformIdentity
      transForm = CGAffineTransformScale(transForm, 0.8, 1)
      transForm = CGAffineTransformRotate(transForm, CGFloat(M_PI_4)) //Making the transformation
      newViewToAdd.layer.shouldRasterize = true //Making the view edges smooth after applying transforamtion
      newViewToAdd.transform = transForm
      self.mainView.addSubview(newViewToAdd) //Adding the view to the main view.
    

    现在,如果手势识别器位于自定义UIView类中 -

    var lastLocation: CGPoint = CGPointMake(0, 0)
    
     override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        self.superview?.bringSubviewToFront(self)
        lastLocation = self.center //Getting the last center point of the view on first touch.
      }
    
      func detectPan(recognizer: UIPanGestureRecognizer){
        let translation = recognizer.translationInView(self.superview!) //Making the translation
        self.center = CGPointMake(lastLocation.x + translation.x, lastLocation.y + translation.y) //Updating the center point.
        switch(recognizer.state){
        case .Began:
                 break
        case .Changed:
            //MARK: - Checking The view is outside of the Superview or not
            if (!CGRectEqualToRect(CGRectIntersection(self.superview!.bounds, self.frame), self.frame)) //if its true then view background color will be changed else background will be replaced.
            {
                self.backgroundColor = outsideTheViewColor
                var imageViewBin : UIImageView
                imageViewBin  = UIImageView(frame:CGRectMake(0, 0, 20, 25));
                imageViewBin.image = UIImage(named:"GarbageBin")
                imageViewBin.center = CGPointMake(self.frame.width/2, self.frame.height/2)
                addSubview(imageViewBin)
    
            }else{
                for subViews in self.subviews{
                    if subViews.isKindOfClass(UIImageView){
                        subViews.removeFromSuperview()
                    }
                    self.backgroundColor = deSelectedColorForTable
                }
            }
        case .Ended:
            if (!CGRectEqualToRect(CGRectIntersection(self.superview!.bounds, self.frame), self.frame)) //If its true then the view will be deleted.
            {
                self.removeFromSuperview()
            }
    
        default: break
        }
    }
    

    主要问题是如果视图没有旋转或转换,那么所有的&#34; CGRectIntersection&#34;在.Changed / .Ended案例中,正如预期的那样正常工作,但如果视图被旋转或转换,那么&#34; CGRectIntersection&#34;即使视图位于&#34; mainView&#34;内部也始终如一。并将其从主视图/超级视图中删除。

    请帮我解决我的错误。

    提前致谢。

1 个答案:

答案 0 :(得分:1)

应用转换后视图的框架会更新。以下代码确保它位于其超视图边界内。

if (CGRectContainsRect(self.superview!.bounds, self.frame))
{
    //view is inside of the Superview
}
else
{
    //view is outside of the Superview
}