【问题标题】:IOS/ARKIT - How to do previous and next buttons which changes 3D model with animations when clicked?IOS/ARKIT - 单击时如何使用动画更改 3D 模型的上一个和下一个按钮?
【发布时间】:2018-09-09 19:15:57
【问题描述】:

我想像幻灯片一样显示 3D 模型。当你点击下一个时,下一个会出现几秒钟的动画......然后下一个......这会随着 UILabel 文本的变化而继续。

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

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

所以:

  1. 从空闲的 3D 模型开始
  2. 用户按下下一步
  3. 改变 3d 模型与固有的动画播放和老挝改变 UI LABEL
  4. 每次用户按下一步时,上述 3D 模型都会发生变化
  5. 如果需要,还可以返回到上一个。

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

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

//DISPLAYs NEXT 3D 模型来自数组的固有动画 }

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

//显示具有固有动画的先前 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 模型尚未正确定位。

【问题讨论】:

  • 欢迎来到 SO。您需要提供更多上下文。你说的是什么3D模型? ARKit? SpriteKit?
  • 嗨 Duncan,谢谢您的回复 我在上面添加了一张图片..它是为 ArKit... 我想将文本与具有一个动画的 3D 模型一起更改。
  • 所以在你的问题中添加一个 ARKit 标签,并解释更多关于你的 3D 模型以及你想对它做什么。

标签: ios swift 3d scenekit arkit


【解决方案1】:

有两种方法可以实现这种行为,

  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 内部的内容视图控制器

【讨论】:

  • 嗨 Aditya 感谢您的回答,但我不熟悉 obj c。我只是添加了应用程序线框图片,请您查看一下。
【解决方案2】:

在 viewDidLoad() 方法中将数据设置为对象。

override func viewDidLoad()
    {
           super.viewDidLoad()

        imageView.image = UIImage(named: strPhotoName)
        lblTitle.text = strTitle
    }

实现 UIPageViewController

创建两个 NSArray 存储图片标题和图片名称

var arrPageTitle: NSArray = NSArray()
        var arrPagePhoto: NSArray = NSArray()

变量初始化 初始化数组。

为 PageViewController 设置数据源。

通过 viewDidLoad() 方法设置 PageViewController 的第一页。

override func viewDidLoad() {
        super.viewDidLoad()

        arrPageTitle = ["This is The App Guruz", "This is Table Tennis 3D", "This is Hide Secrets"];
        arrPagePhoto = ["1.jpg", "2.jpg", "3.jpg"];
        self.dataSource = self
        self.setViewControllers([getViewControllerAtIndex(0)] as [UIViewController], direction: UIPageViewControllerNavigationDirection.Forward, animated: false, completion: nil)
    }

实现数据源方法

viewControllerBeforeViewController() 使用此方法返回上一个视图。在此我设置了一个条件,如果它是第一个视图,则返回 nil,否则返回 ViewController。

func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController?
    {
        let pageContent: PageContentViewController = viewController as! PageContentViewController
        var index = pageContent.pageIndex
        if ((index == 0) || (index == NSNotFound))
        {
            return nil
        }
        index--;
        return getViewControllerAtIndex(index)
    }

viewControllerAfterViewController 使用此方法返回下一个视图。在此我设置了一个条件,如果它是最后一个视图,则返回 nil,否则返回 ViewController。

func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController?
    {
        let pageContent: PageContentViewController = viewController as! PageContentViewController
        var index = pageContent.pageIndex
        if (index == NSNotFound)
        {
            return nil;
        }
        index++;
        if (index == arrPageTitle.count)
        {
            return nil;
        }
        return getViewControllerAtIndex(index)
    }

创建方法获取新的 PageContentViewController

getViewControllerAtIndex 当用户使用手势滑动时,我们必须从情节提要中实例化 ViewController 并分配 ViewController 的所有内容数据并返回它。

func getViewControllerAtIndex(index: NSInteger) -> PageContentViewController
    {
        // Create a new view controller and pass suitable data.
        let pageContentViewController = self.storyboard?.instantiateViewControllerWithIdentifier("PageContentViewController") as! PageContentViewController
        pageContentViewController.strTitle = "\(arrPageTitle[index])"
        pageContentViewController.strPhotoName = "\(arrPagePhoto[index])"
        pageContentViewController.pageIndex = index
        return pageContentViewController
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-21
    • 2021-12-25
    • 2021-06-29
    • 2021-10-26
    • 1970-01-01
    相关资源
    最近更新 更多