【问题标题】:Rotate UIImage and Move旋转 UIImage 并移动
【发布时间】:2013-11-11 14:02:14
【问题描述】:

我已经搜索堆栈溢出太多次并且也发布了一个问题但徒劳无功。我需要在我的拼贴应用程序中实现一个功能,用户可以在其中旋转 uiimage 并将其作为旋转图像移动。知道怎么做吗?如果需要,我会尝试所有这些。在过去的两天里,我很沮丧地寻找它。

起初我使用 CGAffineTransformMakeRotation(angle) 旋转了 UIImage 的框架。它可以工作,但是在旋转后移动图像时,会产生失真。那么还有其他方法吗?

编辑: 说清楚, 旋转角度是自定义的。

【问题讨论】:

  • 您发布了一些旋转代码,但是您是如何移动视图的?需要更多代码才能理解您所做的事情。
  • @疯子一号:如果旋转角度等于 90*n 度,你有失真吗?如果仅在角度不等于 90*n 度时才出现失真 - 您通过更改框架的原点来移动框架?
  • @A-Live 我已经展示了我是如何移动视图的。我通过更新数组中的 imageView 并执行相同的“handlePanGesture”函数来完成它。
  • @RuslanSoldatenko 失真一直在发生。我正在使用 UIRotationGestureRecognizer 旋转它。在旋转一切都很好。当我在旋转后移动视图时,它会扭曲。你正在使用框架原点的变化:
  • @Maniac One:我在移动图片时遇到了失真。它发生在图片转过一个不等于 90*N 度的角度时。如果我通过改变框架的坐标来移动图像,就会出现失真。如果我改变了中心的坐标 - 没有失真。

标签: ios uiimageview uiimage ciimage


【解决方案1】:

检查了一些类似的问题(Change uiview size after rotation transformHow to resize the UIView when CGAffineTransformIdentity)并阅读了Official documentation about CGAffineTransform,我得出了一些简单的结论。将在下面解释它们。

当您使用CGAffineTransform 对某些具有跟随帧变换的对象时,您必须使用一些规则来获得正确的结果:

  1. 如果对象的变换属性等于CGAffineTransformIdentity,您可以更改对象的框架或使用CGAffineTransform,不受限制。

  2. 如果对象的变换属性不等于CGAffineTransformIdentity 并且您想在没有CGAffineTransform 的情况下更改对象的框架:
    a) 将对象变换的值保存到某个局部(或其他类型)变量
    b) 将对象的变换属性设置为 CGAffineTransformIdentity
    c) 改变对象的框架
    d) 从本地(或其他类型)变量中恢复变换值。

  3. 如果对象的变换属性不等于CGAffineTransformIdentity,并且您想使用CGAffineTransform,例如new_transform
    a) 使用CGAffineTransformConcat([object transform] , new_transform)获取result_transform
    b) 将对象的变换值设置为result_transform

遵守这些简单的规则将有助于避免许多问题。

注意:你必须记住,当你使用CGAffineTransformConcat时,所有的变换都会被累加。例如:如果要将对象从 6 度旋转到 7 度,则必须将变换旋转添加到 1 度,而不是 7。否则您将获得旋转 6 + 7 = 13 度。

【讨论】:

  • 这个解释对我帮助很大。我将关注此并在此处发布我的结果输出。感谢您在我的困境中帮助我。过去 2 天我一直坚持使用它,并且正在接近 CIContext,它变得越来越复杂
  • 这给了我一些线索,但我仍然不相信这是否是使用非身份 CGAffineTransform 更新 UIView 大小的最佳方法
【解决方案2】:

对于任何可能迁移到这里的人,可能会发现这部分代码很有用:

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.3];
imageToBeMoved.center = CGPointMake(primaryTapPoint.x   ,primaryTapPoint.y); 
[UIView commitAnimations]; 

更改:imageToBeMoved.frame 为 imageToBeMoved.center 解决了问题

【讨论】:

    猜你喜欢
    • 2010-12-17
    • 2021-08-04
    • 1970-01-01
    • 1970-01-01
    • 2013-01-29
    • 2018-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多