1

我有一个带有许多图像按钮的“主屏幕”。在点击其中一个按钮时,一个详细视图控制器被推到导航控制器上。但是,从视觉上看,我希望按钮中的图像保持在屏幕上的相同位置,而新的视图控制器过渡到它后面的位置。

模态控制器的一个例子是将照片添加到电子邮件或消息中。您在图库中选择的照片会变大(好像它正在向您移动),而撰写消息视图在后台滑动到位,然后照片缩小到消息视图上的适当位置。

我想到的几个选项:

  • 点击按钮后,将图像放置在屏幕上与 UIWindow 的子视图相同的位置。做动画/过渡,然后使图像成为新视图控制器视图的子视图。

  • 与上面相同,但具有清晰背景的模态视图控制器

  • 让 UINavigationController 成为子视图,并使用 UINavigationController 的父视图执行上述操作

上面的所有选项都是相似的,但我很好奇是否有更好的方法来做到这一点,以及代码的位置。我应该继承 UINavigationController 并将转换代码放在那里吗?或者可能是 AppDelegate (虽然这似乎是错误的)?

4

3 回答 3

2

我会向导航控制器或窗口添加子视图,但需要一些视图层次结构。

您需要为 themasterdetailview 控制器提供一种方法来引用imageView每个 ivar 应该没问题。

// PSMasterViewController.m
@interface PSMasterViewController ()

@property (nonatomic, strong) UIImageView *imageView;

@end

@implementation PSMasterViewController

@synthesize imageView = _imageView;

// ...
@end

我已将其放入实现中,因为我不想将其公开给主视图控制器,但您的需求可能会有所不同。

同样的detailViewController

// PSDetailViewController.h
@interface PSMasterViewController : UIViewController

@property (nonatomic, strong) UIImageView *imageView;

@end

// PSDetailViewController.m
@implementation PSDetailViewController

@synthesize imageView = _imageView;

// ...
@end

现在假设 imageView 已经在主视图控制器中创建并呈现,我们需要在即将推送时实现一些视图体操

- (void)methodThatPushesTheNextViewController;
{
    CGRect destinationFrame = [self.view convertRect:self.imageView.frame toView:self.navigationController.view];
    [self.imageView removeFromSuperview];
    [self.navigationController.view addSubview:self.imageView];
    self.imageView.frame = destinationFrame;

    PSDetailViewController *detailViewController = [[PSDetailViewController alloc] init];
    detailViewController.imageView = self.imageView;
    self.imageView = nil; // The detailViewController should own this now
    [self.navigationController pushViewController:detailViewController animated:YES];
}

现在在细节视图控制器中,我们需要做与我们刚刚做的相反的事情,这viewDidAppear:是一个好地方,尤其是你提到的你可能想要移动和缩放

- (void)viewDidAppear:(BOOL)animated;
{
    [super viewDidAppear:animated];

    CGRect startFrame = [self.view convertRect:self.imageView.frame fromView:self.navigationController.view];
    [self.imageView removeFromSuperview];
    [self.view addSubview:self.imageView];
    self.imageView.frame = startFrame;

    [UIView animateWithDuration:0.25f
                     animations:^{
                         self.imageView.frame = [self someNewFrame];
                     }];
}
于 2012-05-12T22:54:32.727 回答
0

选项1

你也可以在没有 ModalViewController 的情况下做到这一点。首先要记住,您必须删除图像并再次将其移至 pushViewController,因为如果发生视图转换,则会再次添加新的 viewController,并且您之前的视图会消失。因此,通过向被推送的 viewController 发送 NSNotification 并创建具有相同帧的视图来执行此操作。还记得在推送新的 ViewController 之前从 superview 中删除视图。

选项2

如果所有需要相关视图的视图控制器都继承自单个 ViewController 子类,则可以调用 [super init] 方法创建视图并将其添加到 viewDidLoad 方法中。

于 2012-05-12T21:41:03.553 回答
-1

您可以按照您的设想在视图上执行“UIView Animation”,或者您可以使用 iCarousel 来获得更清晰的 Animation icarousel SourceCode

于 2012-05-12T21:09:00.947 回答