重绘 UIViewController 及其子视图

Redrawing UIViewController and its subviews

我有一个 UIViewController,它有许多子视图,如 UILabels、UIImages 和 UIWebview。通过用户定义的操作,UIViewController 的子视图在 UIViewController 的视图内以不同的大小和不同的位置进行动画处理。是否可以通过用户定义的不同操作来撤消此操作?我想让所有子视图恢复到它们在动画 运行 之前的位置和大小。我想到了两种可能的解决方案:

  1. 动画前用view.subviews()方法获取子视图的属性是运行,然后动画后的子视图设置到这个数组中的属性,或者,
  2. 在 UIViewController 上调用一个方法,告诉它根据故事板文件中设置的属性重绘所有子视图。

这些是完成我想做的事情的正确方法吗?如果是这样,我将如何去做呢? (我不知道如何以编程方式实现我的任何一个想法。)

非常感谢任何帮助。谢谢。

您可以在更改之前缓存所有子视图的帧和 运行 动画,这样您甚至可以缓存多个动作。 stack 结构将是完美的,但在界面构建器中无法实现这一点,您必须引用 IB 的出口到代码以获得它们的框架。

这是解决方案。

@interface ViewController ()
@property (strong, nonatomic) NSMutableArray *frames;
@end

@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];

    //Saving initial frames of all subviews
    self.frames = [NSMutableArray new];
    NSArray *allViews = [self allViewsOfView:self.view];
    for (UIView *view in allViews) {
        CGRect frame = view.frame;
        NSValue *frameValue = [NSValue valueWithCGRect:frame];
        [self.frames addObject:frameValue];
    }
}

- (NSMutableArray *)allViewsOfView:(UIView *)view
{
    NSMutableArray *result = [NSMutableArray new];
    [result addObject:view];
    for (UIView *subView in view.subviews) {
        [result addObjectsFromArray:[self allViewsOfView:subView]];
    }

    return result;
}

- (void)resetFrames
{
    NSArray *allViews = [self allViewsOfView:self.view];
    for (UIView *view in allViews) {
        NSValue *frameValue = [self.frames objectAtIndex:[allViews indexOfObject:view]];
        CGRect frame = [frameValue CGRectValue];
        view.frame = frame;
    }
}

@end

每当您想将视图的帧恢复为初始值时调用 [self resetFrame];