IOS/ARKIT - 如何做上一个和下一个按钮,点击时用动画改变 3D 模型?

标签 ios swift 3d scenekit arkit

我想像幻灯片放映一样显示 3D 模型。当您单击下一步时,下一个会出现几秒钟的动画……然后是下一个……并且这会随着 UILabel 文本的变化而继续。

PressedNextbtn --->(在 ARSCNView 上)新 3D 模型显示 ---> PressedNextbtn --->(在 ARSCNView 上)新 3D 模型显示 --->

我还想添加一个上一个按钮,这样它也可以返回。如果不清楚,请查看下图以获取更多信息。

所以:

  1. 从闲置的 3D 模型开始
  2. 用户点击下一步
  3. 更改带有固有动画播放的 3d 模型和 laos 更改 UI LABEL
  4. 每次用户按下 next 时,上面的 3D 模型都会改变
  5. 还可以在必要时返回到之前的状态。

注意:我已经弄清楚了 UILabel,现在我需要将 3D 模型幻灯片放映到图像中看到的系统上。我希望这能澄清一切。

@IBAction func nextPressed(_ sender: Any) {
    displayNext()

//DISPLAYs 来自数组的下一个 3D 模型固有动画

@IBAction func prevPressed(_ sender: Any) {
    getPrevious()

//DISPLAY 具有固有动画的先前 3D 模型

func displayNext()  {
    guard currentIndex < myArray.count else {
       // timer.invalidate() //if you don't want to repeat showing the images you can invalidate the timer.
        currentIndex = 0 // add this if you want to repeat showing the image
        return
    }
    allArray.append(myArray[currentIndex])
    sildeText.text = myArray[currentIndex]
    currentIndex += 1



}

func getPrevious() {
    if allArray.count > 1 {
        allArray.removeLast()
        sildeText.text = allArray.last
    }
    else {
        sildeText.text = allArray.last
    }
}

请检查应用程序结构..3D 模型尚未正确定位。

enter image description here

最佳答案

有两种选择可以实现这种行为,

  1. 添加 UIPageviewController 并在内容中添加您的 UILabel 和 3D 模型,并在单击“下一步”或“上一步”按钮时更改页面索引。
  2. 使用 Horizo​​ntal UIScrollView 并在单击“Next”或“Previous”按钮时更改框架以及 UILabel 和 3D 模型。

我更喜欢使用 UIPageviewController,

在 ViewController.m 中,

导入“ViewController.h”

@interface ViewController () <UIPageViewControllerDataSource, UIPageViewControllerDelegate>

@property (nonatomic,strong) UIPageViewController *PageViewController;
@property (nonatomic, strong) NSArray *arrPageTitles;
@property (nonatomic, strong) NSArray *arrPageDescription;

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
        
    // Create page view controller
    self.PageViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"PageViewController"];
    self.PageViewController.dataSource = self;
    self.PageViewController.delegate = self;
    self.shouldShowPageController = YES;
    
    [self addChildViewController:PageViewController];
    [self.view addSubview:PageViewController.view];
    [self.PageViewController didMoveToParentViewController:self];
}

#pragma mark - Page View Datasource Methods

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController{
    NSUInteger index = ((PageContentVC *) viewController).pageIndex;
    
    if (index == NSNotFound) {
        return nil;
    }
    if (index == 0) {
        return [self viewControllerAtIndex:([self.arrPageTitles count] - 1)];
    }
    index--;
    return [self viewControllerAtIndex:index];
}

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController{
    NSUInteger index = ((PageContentVC *) viewController).pageIndex;
    
    if (index == NSNotFound){
        return nil;
    }
    index++;
    if (index == [self.arrPageTitles count]){
        return [self viewControllerAtIndex:0];
    }
    return [self viewControllerAtIndex:index];
}

#pragma mark - PageContent View Controller Method

- (PageContentVC *)viewControllerAtIndex:(NSUInteger)index{
    if (([self.arrPageTitles count] == 0) || (index >= [self.arrPageTitles count])) {
        return nil;
    }
    // Create a new view controller and pass suitable data.
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"PageContentVC" bundle:[NSBundle mainBundle]];
    PageContentVC *pageContentViewController = [storyboard instantiateViewControllerWithIdentifier:@"PageContent"];
    pageContentViewController.title = self.arrPageImages[index];
    pageContentViewController.description = self.arrPageTitles[index];
    pageContentViewController.pageIndex = index;    
    return pageContentViewController;
}
@end

这里,PageContentVC 是 UIPageviewController 中的内容 View Controller

关于IOS/ARKIT - 如何做上一个和下一个按钮,点击时用动画改变 3D 模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49579637/

相关文章:

ios - 为什么在检查 Firebase 中是否存在用户名时从 textField 中删除文本时应用程序崩溃?

ios - 拍摄数据快照时出现 Firebase NSNull 异常

ios - 从自定义类调用方法而不创建新实例,带有 Int 参数的 IntegerLiterallConvertible 错误

html - 使用 CSS,如何在鼠标进入时将 3D 框旋转 180 度并在离开时继续旋转 360 度?

opengl - 在我的代码 : Whats the licensing model? 中使用 NVidia FxAA

ios - 旋转后 UIImagePickerController 的状态栏和布局问题

ios - 为什么我会使用 unowned self?

android - Android 游戏开发者使用哪个 OpenGL/3d 框架?

objective-c - 延迟applicationDidEnterBackground截屏

ios - 呈现 UIImagePicker View 时检测设备旋转