DeveloperFeaturediOS DeveloperMobile TechnologyObjective CProgramming Language

เขียนแอพฯ iPhone กับ Xcode5 iOS7 ทำหน้า Slide View เลื่อนด้านข้าง

สำหรับเขียนแอพฯ iPhone บน XCode5 และ iOS7 รอบนี้ จะเป็นการสอนวิธีสร้างหน้า Slide View แบบง่าย สำหรับทำหน้า Tutorial บน Apps ครับ

สำหรับการทำหน้า Slide นั้นหลายๆ แอพฯ ใช้เป็นหน้าจอแนะนำการใช้งานเบื้องต้นหรือเอาง่ายๆ ให้สังเกต UI ตัวใหม่ของ แอพพลิเคชัน Twitter สำหรับ Mobile เวอร์ชันใหม่ก็ได้ครับ

มาเข้าเรื่องกันเลยดีกว่า

Screen Shot 2556-12-18 at 11.33.14 PM

ก่อนอื่นให้ทำการเปิด XCode5 ขึ้นมาครับ สร้าง Single View Application ขึ้นมาใหม่ ตั้งค่าให้เรียบร้อย

Screen Shot 2556-12-18 at 11.33.37 PM

ตั้งค่าให้เรียบร้อย ชื่อตัวอย่างก็ SlideView ครับ ต่อมาให้เปิด MainStoryBoard ขึ้นมา ให้สร้าง ViewController ตัวใหม่มาวางรอไว้ และคราวนี้ให้เลือกใช้ Page View Controller มาวางไว้

Screen Shot 2556-12-18 at 11.35.04 PM

ลากเจ้า Page View Controller มาวางไว้บน MainStoryBoard

Screen Shot 2556-12-18 at 11.35.28 PM

ต่อมาเราต้องวางแผน แบ่ง StoryBoard ID ของ Page View Controller และ ViewController ธรรมดาๆ ขึ้นมาก่อน สำหรับ Page View Controller ให้สร้าง ID ชื่อว่า “PageViewController” และ ViewController ตั้งชื่อว่า “PageContentViewController” ครับ

Screen Shot 2556-12-18 at 11.36.57 PM

อีกตัวก็

Screen Shot 2556-12-18 at 11.46.39 PM

ลาก UIImage และ UILabel มาวางตกแต่งหน้า ViewController หรือ “PageContentViewController” ครับ

Screen Shot 2556-12-18 at 11.45.30 PM

สำหรับ Page View controller นั้นให้ปรับ Action ของมันตามรูปครับ เป็น “Scroll”

Screen Shot 2556-12-18 at 11.37.24 PM

ให้ไป Add New File ขึ้นมาใหม่ใน Project ของเรา

Screen Shot 2556-12-18 at 11.45.54 PM

ตั้งชื่อว่า “PageContentViewController” ครับ

Screen Shot 2556-12-18 at 11.46.04 PM

ให้ทำการ Add class ของ PageContentViewController เข้ากับหน้า ViewController ให้เรียบร้อยครับ

Screen Shot 2556-12-18 at 11.46.52 PM

เปิดไฟล์ PageContentViewController.h ขึ้นมา แล้วลาก Object จาก ViewController ไป Link กัน สร้าง IBOutlet ใหม่ตามนี้

Screen Shot 2556-12-18 at 11.47.48 PM

ตั้ง UIImage กับ BGImg

Screen Shot 2556-12-18 at 11.48.06 PM

ส่วน UILabel ก็เชื่อมกับ TitleText

ต่อมาเปิด หน้า ViewController.h ขึ้นมา แล้วเอาหน้าแรก สร้างปุ่มเชื่อม IBAction ขึ้นมาใหม่ ตั้งชื่อว่า Slider()

Screen Shot 2556-12-18 at 11.48.58 PM

เปิดไฟล์ PageContentViewController.h ขึ้นมา ทำการเพิ่ม Code ให้เป็นแบบนี้

#import <UIKit/UIKit.h>

@interface PageContentViewController : UIViewController
@property (weak, nonatomic) IBOutlet UIImageView *backgroundImageView;
@property (weak, nonatomic) IBOutlet UILabel *titleLabel;
@property NSUInteger pageIndex;
@property NSString *titleText;
@property NSString *imageFile;
@end

เช็ค ViewDidLoad() ของ PageContentViewController.m เข้าไปตามนี้

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.backgroundImageView.image = [UIImage imageNamed:self.imageFile];
    self.titleLabel.text = self.titleText;

}

ต่อมาเปิดไฟล์ ViewController.h ขึ้นมา Import ไฟล์ PageContentViewController.h เข้าไป แก้ไข IBAction ของ Slider() เหมือนข้างล่าง

#import <UIKit/UIKit.h>
#import "PageContentViewController.h"

@interface ViewController : UIViewController 

- (IBAction)startWalkthrough:(id)sender;
@property (strong, nonatomic) UIPageViewController *pageViewController;
@property (strong, nonatomic) NSArray *pageTitles;
@property (strong, nonatomic) NSArray *pageImages;

@end

หารูปประกอบ สัก 3 รูป เข้าไปวางไว้ใน Project ของเรา

Screen Shot 2556-12-18 at 11.53.31 PM

เปิดไฟล์ ViewController.m ขึ้นมา เพิ่ม Code เข้าไปใน ViewDidLoad() ดังนี้เพื่อเอาภาพ และข้อความไปโชว์แบบง่ายๆ ก่อน

- (void)viewDidLoad
{
    [super viewDidLoad];
	// Create the data model
    _pageTitles = @[@"SEXY 1", @"SEXY 2", @"SEXY 3"];
    _pageImages = @[@"1.jpg", @"2.jpg", @"6.jpg"];

    // Create page view controller
    self.pageViewController = [self.storyboard 
       instantiateViewControllerWithIdentifier:@"PageViewController"];
    self.pageViewController.dataSource = self;

    PageContentViewController *startingViewController = [self viewControllerAtIndex:0];
    NSArray *viewControllers = @[startingViewController];
    [self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];

    // Change the size of page view controller
    self.pageViewController.view.frame = 
    CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height - 30);

    [self addChildViewController:_pageViewController];
    [self.view addSubview:_pageViewController.view];
    [self.pageViewController didMoveToParentViewController:self];

}

เพิ่ม code สำหรับ Control เจ้า PageViewController ให้เก็บ Index ก่อน

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
{
    NSUInteger index = ((PageContentViewController*) viewController).pageIndex;

    if (index == NSNotFound) {
        return nil;
    }

    index++;
    if (index == [self.pageTitles count]) {
        return nil;
    }
    return [self viewControllerAtIndex:index];
}

- (NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageViewController
{
    return [self.pageTitles count];
}

- (NSInteger)presentationIndexForPageViewController:(UIPageViewController *)pageViewController
{
    return 0;
}

ตามด้วย การเรียกแสดงผลของ PageContentViewController ให้เก็บเป็น Index ปรกติ

#pragma mark - Page View Controller Data Source

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController
{
    NSUInteger index = ((PageContentViewController*) viewController).pageIndex;

    if ((index == 0) || (index == NSNotFound)) {
        return nil;
    }

    index--;
    return [self viewControllerAtIndex:index];
}

ฟังก์ชัน เล็กน้อยในการ เตรียมพร้อมสำหรับการส่งค่า Index ของหน้า แบบ Recursive ครับ

- (PageContentViewController *)viewControllerAtIndex:(NSUInteger)index
{
    if (([self.pageTitles count] == 0) || (index >= [self.pageTitles count])) {
        return nil;
    }

    // Create a new view controller and pass suitable data.
    PageContentViewController *pageContentViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"PageContentViewController"];
    pageContentViewController.imageFile = self.pageImages[index];
    pageContentViewController.titleText = self.pageTitles[index];
    pageContentViewController.pageIndex = index;

    return pageContentViewController;
}

จัดาร IBAction เล็กน้อย

- (IBAction)startWalkthrough:(id)sender {
    PageContentViewController *startingViewController = [self viewControllerAtIndex:0];
    NSArray *viewControllers = @[startingViewController];
    [self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionReverse animated:NO completion:nil];
}

เมื่อใส่ครบแล้ว คราวนี้มาปรับในส่วนของ PageIndicator หรือ เจ้า วงกลม เล็กๆ ที่จะแสดงจำนวนหน้า ว่าตำแหน่งปัจจุบันนี้เราอยู่หน้าไหน ใน PageViewController ครับ ให้เข้าไปแก้ที่ AppDelegate.m ส่วนของ ฟังก์ชันเมธอด didFinishLaunchingWithOptions()

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    UIPageControl *pageControl = [UIPageControl appearance];
    pageControl.pageIndicatorTintColor = [UIColor lightGrayColor];
    pageControl.currentPageIndicatorTintColor = [UIColor blackColor];
    pageControl.backgroundColor = [UIColor whiteColor];

    return YES;
}

ทดสอบการรัน แอพพลิเคชันของเราดูให้ ลองปาดนิ้วไปทาง ขวา และ ซ้าย จะเป็นการเลื่อน View ครับ

iOS Simulator Screen shot Dec 19, 2556 BE, 12.01.07 AM

ปาดซ้าย

iOS Simulator Screen shot Dec 19, 2556 BE, 12.01.03 AM

Screen Shot 2556-12-19 at 12.01.21 AM

หวังว่าคงจะช่วยเหลือหลายๆ คนที่อยากทำหน้า Tutorial ได้บ้างนะครับ

อ้างอิง: http://www.appcoda.com/

Asst. Prof. Banyapon Poolsawas

อาจารย์ประจำสาขาวิชาการออกแบบเชิงโต้ตอบ และการพัฒนาเกม วิทยาลัยครีเอทีฟดีไซน์ & เอ็นเตอร์เทนเมนต์เทคโนโลยี มหาวิทยาลัยธุรกิจบัณฑิตย์ ผู้ก่อตั้ง บริษัท Daydev Co., Ltd, (เดย์เดฟ จำกัด)

Related Articles

Back to top button

Adblock Detected

เราตรวจพบว่าคุณใช้ Adblock บนบราวเซอร์ของคุณ,กรุณาปิดระบบ Adblock ก่อนเข้าอ่าน Content ของเรานะครับ, ถือว่าช่วยเหลือกัน