iOS 如何为旋转、缩放和将 UIView 添加到 UIIMageView 进行撤消操作

Posted

技术标签:

【中文标题】iOS 如何为旋转、缩放和将 UIView 添加到 UIIMageView 进行撤消操作【英文标题】:iOS how can I make undo action for rotating, scaling and adding UIView to UIIMageView 【发布时间】:2016-06-22 08:12:46 【问题描述】:

我有一个UIImageView,我可以向这个UIImageView 添加新项目(作为子视图),或者我可以移动和旋转UIImageView 中的项目。 我正在尝试对此项目进行撤消操作,所以我的代码;

在每个新操作之前,我都会获取UIImageView 的副本并将它们存储在NSMutableArray

[self.lastActions addObject:[self getCopy]];

我得到了具有不同内存地址的相同 UIImageView。 (我不确定这是不是正确的方法)

-(UIImageView *)getCopy
    NSData *archivedViewData = [NSKeyedArchiver archivedDataWithRootObject:self.imageView];
    id clone = [NSKeyedUnarchiver unarchiveObjectWithData:archivedViewData];
    return clone;

当我撤消时;

-(IBAction)undoButtonClicked:(id)sender

    UIImageView *lastImageView = [self.lastActions lastObject];

    [UIView animateWithDuration:0.1 animations:^
        self.imageView = lastImageView;
    ];

    [self.lastActions removeObject:lastImageView];     

但它不会改变屏幕上的 UIImageView。 对我的代码有什么问题有任何想法吗?

【问题讨论】:

我认为主要的UIImageViewself.imageView 已经改变了转换,试试这个self.imageView.transform=CGAffineTransformIdentity; 然后self.imageView.transform= lastImageView.transform; 你的需求是什么?更改图像或图像视图 @iphonic 我尝试了,但它不起作用 我正在尝试将这个“self.ImageView”从视图中虚拟删除。第一次只复制了图像,第二次我们无法检索图像视图。 【参考方案1】:

我正在尝试您的上述想法。无法获得输出。这是实现相同目标的另一个想法。 我正在使用图像来显示同一图像视图“撤消”操作上的图像更改。我已经实现了如下方法。

它在我身边工作正常。 我希望这会对我们有所帮助。

// 撤消按钮操作

-(IBAction)undoButtonClicked:(id)sender
      UIImage *lastImageView =  lastImageView = (UIImage *)[lastActions lastObject];

     if( [lastActions count]!=0) 
           [UIView animateWithDuration:0.2 animations:^
           self.imageView.image = lastImageView;
           ];

           [lastActions removeObject:lastImageView];
      

// 从公共变量 self.imageview 复制图像

-(IBAction)copyButton:(id)sender

    [lastActions addObject:self.imageView.image];

    

// 随机改变方向以旋转图像。

-(UIImageOrientation )randonImageOrientation 

   int min = 0 ;
   int max = 3;
   UIImageOrientation ori;
   int randomNumber = min + rand() % (max-min);

   switch (randomNumber)
   
    case 0 :
        ori = UIImageOrientationDown;
        break;

    case 1:
        ori = UIImageOrientationLeft;
        break;

    case 2:
        ori = UIImageOrientationRight;
        break;
    case 3:
        ori = UIImageOrientationUp;
        break;
    default :
        ori = UIImageOrientationUp;
        break;

   
return  ori;

//下面使用旋转图像的方法

 -(UIImage *)imageOrientation :(UIImageOrientation)imageOri image:(UIImage *)oriImage 

   UIImage * LandscapeImage = oriImage;
   UIImage * PortraitImage = [[UIImage alloc] initWithCGImage: LandscapeImage.CGImage
                                                     scale: 0.5
                                               orientation: imageOri];
   return PortraitImage;
 

【讨论】:

以上是关于iOS 如何为旋转、缩放和将 UIView 添加到 UIIMageView 进行撤消操作的主要内容,如果未能解决你的问题,请参考以下文章

iOS Swift:无需调整大小即可旋转和缩放 UIView

我如何为 iOS 克隆/复制某种 UIView?

在 UIScrollview Swift 中旋转 UIView

如何为 UIView 添加圆角半径

iOS:UIImage 缩放以填充 UIView

当设备旋转时,如何为视图设置正确的边界?