2017-01-20 19 views
5

tôi là tạo ra một ứng dụng thẻ flash đơn giản như minh họa dưới đây:kiểm soát swipe lại hành động trong UINavigationController

flash cards not animated

Tôi muốn có một swipe ngược trở lại để xảy ra như thế này:

flash cards animated

Để thực hiện việc này, onBack(index: Int) là những gì tôi cần được gọi khi vuốt lại xảy ra (để cập nhật thẻ được hiển thị):

import UIKit 

class ViewController: UIViewController { 
    @IBOutlet weak var flashCardLabel: UILabel! 

    // Populate initial content 
    let content = ["Lorem", "Ipsum", "Dolor", "Sit"] 

    // Index of where we are in content 
    var index = 0 

    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 

    // Label text based on index 
    func setLabelToIndex() { 
     flashCardLabel.text = content[index] 
    } 

    // Go back 
    @IBAction func back(_ sender: Any) { 
     if index > 0 { 
      index = index - 1 
      setLabelToIndex() 
     } 
    } 

    // Go forward 
    @IBAction func next(_ sender: Any) { 
     if index + 1 < content.count { 
      index = index + 1 
      setLabelToIndex() 
     } 
    } 

    // Desired function to be called 
    // when swiping back in navigation stack 
    func onBack(index: Int) { 
     self.index = index 
     setLabelToIndex() 
    } 
} 
+2

Tôi xin lỗi, nhưng câu hỏi này là một mớ hỗn độn. Tôi không thể hiểu những gì bạn đang cố gắng làm. –

+4

Tại sao không sử dụng 'UINavigationController'? Trên mỗi "trở lại" và "tiếp theo", bạn có thể đẩy/bật mà không có hoạt ảnh. Vuốt ngược sẽ tự động hoạt động. – Sulthan

+0

@Sulthan Phương pháp này có lưu trữ mỗi ViewController trong bộ nhớ không? – user2560886

Trả lời

4

Nếu tôi hiểu chính xác câu hỏi của bạn, bạn muốn có thể vuốt giữa các câu hỏi và/hoặc có hiệu ứng vuốt khi bạn nhấp vào "Tiếp theo" hoặc "Quay lại". Nếu đúng như vậy, tôi khuyên bạn nên nhúng UILabel vào một số UIScrollView. Check this out:

class ViewController: UIViewController,UIScrollViewDelegate { 

    let content = ["Lorem", "Ipsum", "Dolor", "Sit"] 
    let scrollView = UIScrollView(frame: CGRect(x: 0, y: 0, width: 320, height: 300)) 

    var index = 0 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     scrollView.delegate = self   
     scrollView.contentSize = CGSize(width: self.view.frame.width * content.count, height: self.scrollView.frame.size.height) 
     scrollView.isPagingEnabled = true 

     // add labels to pages 
     for i in 0 ..< content.count { 
      let label = UILabel(frame: CGRect(x: self.view.center.x * (i + 1), y: self.view.center.y, width: 100, height: 50)) 
      label.textAlignment = .center 
      label.text = content[i] 
      scrollView.addSubview(label) 
     } 
     self.view.addSubview(scrollView) 

    } 

    // Go back 
    @IBAction func back(_ sender: Any) { 
     if index > 0 { 
      index = index - 1 

      // scroll to page 
      let offset = CGPoint(x: CGFloat(index) * self.view.frame.width, y: 0) 
      self.scrollView.setContentOffset(offset, animated: true) 
     } 
    } 

    // Go forward 
    @IBAction func next(_ sender: Any) { 
     if index + 1 < content.count { 
      index = index + 1 

      // scroll to page 
      let offset = CGPoint(x: CGFloat(index) * self.view.frame.width, y: 0) 
      self.scrollView.setContentOffset(offset, animated: true) 
     } 
    } 

    func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { 
     index = round(scrollView.contentOffset.x/scrollView.frame.size.width) 
    } 
} 

Giải thích:

Bạn về cơ bản tạo ra một UIScrollView để xử lý các hiệu ứng pagination và thêm một UILabel cho mỗi trang với nội dung tương ứng từ mảng content. Mỗi lần người dùng cuộn đến một trang khác, index được cập nhật thành chỉ mục của trang hiện tại. Và cuối cùng, khi người dùng nhấp vào "Tiếp theo" hoặc "Quay lại", bạn cuộn đến trang tiếp theo hoặc trang trước

1

Nếu bạn muốn bằng cách nhấn & Trình điều hướng điều hướng cửa sổ, bạn có thể thực hiện bằng cách tạo biến chỉ mục tĩnh. Đây là mã

class ViewController: UIViewController { 


    @IBOutlet weak var flashCardLabel: UILabel! 

    // Populate initial content 
    let content = ["Lorem", "Ipsum", "Dolor", "Sit"] 

    // Index of where we are in content 
    static var INDEX = 0; 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.next(nil); 
    } 


    // Label text based on index 
    func setLabelToIndex() { 
     flashCardLabel.text = content[ViewController.INDEX] 
    } 

    // Go back 
    @IBAction func back(_ sender: Any?) { 
     if ViewController.INDEX > 0 { 
      ViewController.INDEX = ViewController.INDEX - 1 
      setLabelToIndex() 
     } 
    } 

    // Go forward 
    @IBAction func next(_ sender: Any?) { 
     if ViewController.INDEX + 1 < content.count { 
      ViewController.INDEX = ViewController.INDEX + 1 
      setLabelToIndex() 
     } 
    } 

    // Desired function to be called 
    // when swiping back in navigation stack 
    func onBack(index: Int) { 
     ViewController.INDEX -= 1; 
     //setLabelToIndex() 
    } 


    override func didMove(toParentViewController parent: UIViewController?) { 
     if parent == nil { 
      self.onBack(index: ViewController.INDEX); 
     } 

    } 

} 
1

tôi có thể nói với bạn rằng swipe rằng UINavigationController suppport là swipe khi người dùng bắt đầu swipping ngón tay từ bên trái của màn hình sang phải chỉ để pop nhìn từ chuyển hướng bạn không thể đẩy nó trở lại bằng cách chuyển từ cạnh phải sang trái trong iPhone, điều này là mặc định trong UINavigationController

tôi đang viết mã của mình như tôi đang sử dụng, bạn cần tùy chỉnh nó một cách phù hợp, tôi không có thời gian để chỉnh sửa, tôi sẽ nói bạn thêm

#pragma mark for pageView 
- (UIViewController *) viewControllerAtIndex:(NSUInteger)index 
{ 
if (index > (self.imageArray.count-1)) 
    return nil; 

UIViewController *viewController = nil; //// 
GalleryItems *item = self.imageArray[index]; 
NSString *cachedGalleryItemName = [item getCachedPhotoFileNameWithPath]; 
if ([[NSFileManager defaultManager] fileExistsAtPath:cachedGalleryItemName]) 
{ 
    ImageViewController *imageVC = [[ImageViewController alloc] initWithNibName:@"ImageViewController" bundle:nil]; 
    imageVC.galleryItem = item; 
    imageVC.cachedGalleryItemName = cachedGalleryItemName; 
    imageVC.index = index; 
    viewController = imageVC; 
} 
else 
{ 
    if (self.downloadViewController) 
    { 
     if (self.indexOfDownloadInProgress == index) 
      viewController = self.downloadViewController; 
     else 
     { 
      FileDownloader *fileDownloader = [DataDownloadManager existingFileDownloader:cachedGalleryItemName]; 
      if (! fileDownloader) 
      { 
       fileDownloader = [[FileDownloader alloc] init]; 
       [fileDownloader loadURL:item.photoURL forFilePath:cachedGalleryItemName withReceipt:nil]; 
       fileDownloader.delegate = nil; 
       fileDownloader.notificationName = item.contentId; 
       fileDownloader.queuePriority = NSOperationQueuePriorityNormal; 
       [[DataDownloadManager sharedInstance].operationQueue addOperation:fileDownloader]; 
      } 
     } 
    } 
    else 
    { 
     DownloadViewController *downloadVC = [[DownloadViewController alloc] initWithNibName:@"DownloadViewController" bundle:nil]; 
     downloadVC.delegate = self; 
     downloadVC.downloadCompleteNotificationName = item.contentId; 
     downloadVC.asset = item; 
     downloadVC.backgroundImageFileName = nil; 
     downloadVC.totalFileSize = nil; 
     downloadVC.URLString = item.photoURL; 
     downloadVC.cachedFileName = cachedGalleryItemName; 
     self.indexOfDownloadInProgress = index; 
     self.downloadViewController = downloadVC; 
     viewController = downloadVC; 
    } 
} 
return viewController; 
} 

Bây giờ sử dụng chức năng này để xác định bộ điều khiển xem

-(NSUInteger) indexOfViewController:(UIViewController *)viewController 
{ 
NSUInteger index = nil; 

if ([viewController isMemberOfClass:[ImageViewController class]]) 
{ 
    ImageViewController *currentViewController = (ImageViewController *)viewController; 
    index = currentViewController.index; 
} 
else if ([viewController isMemberOfClass:[DownloadViewController class]]) 
    index = self.indexOfDownloadInProgress; 

return index; 
} 

- (UIViewController *)viewController:(UIViewController *)viewController ForBeforeAfter:(NSInteger) beforeAfter 
{ 
NSUInteger index = [self indexOfViewController:viewController]; 

if (index == NSNotFound) 
    return nil; 

index = index + beforeAfter; 
if ([DataDownloadManager sharedInstance].internetNotAvailable) 
{ 
    while (index < self.imageArray.count - 1) 
    { 
     GalleryItems *item = self.imageArray[index]; 
     if ([item isDownloaded]) 
      break; 
     index = index + beforeAfter; 
    } 
} 
return [self viewControllerAtIndex:index]; 
} 

tại làm điều này trong lần xem trang điều khiển đại biểu

-(UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController 
{ 
return [self viewController:viewController ForBeforeAfter:-1]; 
} 

-(UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController 
{ 
return [self viewController:viewController ForBeforeAfter:+1]; 
} 

điều khiển xem trang init như thế này

- (void)initPageViewController:(UIViewController *)initViewController 
{ 
self.pageViewController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil]; 

[self.pageViewController setDataSource:self]; 

[self.pageViewController setViewControllers:@[initViewController] direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:nil]; 

[self.pageViewController.view setFrame:self.view.frame]; 
[self addChildViewController:self.pageViewController]; 
[self.view addSubview:self.pageViewController.view]; 
[self.pageViewController didMoveToParentViewController:self]; 
[self.view sendSubviewToBack:self.pageViewController.view]; 
} 

trong viewDidLoad của lớp (trong trường hợp của tôi nó là DisplayImageViewController) bạn đang sử dụng trang này, bạn có thể thêm tine mã này để khởi tạo

[self initPageViewController:[self viewControllerAtIndex:self.index]]; 

lớp DisplayImageViewController này được sử dụng để hiển thị hình ảnh bạn chỉ cần loại bỏ giao diện người dùng thành thứ bạn muốn.

và trước khi bạn đẩy điều khiển quan điểm này trong việc điều khiển thiết lập thuộc tính như thế này

DisplayImageViewController *divc = initialize display view controller class; // here you just set the item in array in which you want to implement swipe 
    divc.imageArray = self.imageArray; 
    divc.galleryAsset = self.gallery; 
    divc.index = indexPath.item; 
    [self presentViewController:divc animated:YES completion:nil]; 
Các vấn đề liên quan