重绘 UIViewController 及其子视图
Redrawing UIViewController and its subviews
我有一个 UIViewController,它有许多子视图,如 UILabels、UIImages 和 UIWebview。通过用户定义的操作,UIViewController 的子视图在 UIViewController 的视图内以不同的大小和不同的位置进行动画处理。是否可以通过用户定义的不同操作来撤消此操作?我想让所有子视图恢复到它们在动画 运行 之前的位置和大小。我想到了两种可能的解决方案:
- 动画前用
view.subviews()
方法获取子视图的属性是运行,然后动画后的子视图设置到这个数组中的属性,或者,
- 在 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];
。
我有一个 UIViewController,它有许多子视图,如 UILabels、UIImages 和 UIWebview。通过用户定义的操作,UIViewController 的子视图在 UIViewController 的视图内以不同的大小和不同的位置进行动画处理。是否可以通过用户定义的不同操作来撤消此操作?我想让所有子视图恢复到它们在动画 运行 之前的位置和大小。我想到了两种可能的解决方案:
- 动画前用
view.subviews()
方法获取子视图的属性是运行,然后动画后的子视图设置到这个数组中的属性,或者, - 在 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];
。