62
Интерфейсы, продолжение Разработка приложений для iOS Лекция 3 Глеб Тарасов

Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение

  • Upload
    -

  • View
    1.726

  • Download
    5

Embed Size (px)

Citation preview

Page 1: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение

Интерфейсы, продолжение

Разработка приложений для iOS

Лекция 3

Глеб Тарасов

Page 2: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение

Сложные контроллеры

Page 3: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение

UINavigationController

Page 4: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение
Page 5: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение

ViewController *c = [[ViewController alloc] initWithNibName:@"ViewController"

bundle:nil];

UINavigationController *nc = [[UINavigationController alloc] initWithRootViewController:c];

Page 6: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение

- (IBAction)buttonTapped{ UIViewController *c = [[SubViewController alloc] initWithNibName:@"SubViewController" bundle:nil];

[self.navigationController pushViewController:c animated:YES];}

Page 7: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{ self = [super initWithNibName:nibNameOrNil

bundle:nibBundleOrNil]; if (self) { self.title = @"ViewController"; } return self;}

Page 8: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение
Page 9: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение

UITabBarController

Page 10: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение
Page 11: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение

ViewController *c = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];

SubViewController *s = [[SubViewController alloc] initWithNibName:@"SubViewController" bundle:nil]; UITabBarController *tc = [[UITabBarController alloc] init];

tc.viewControllers = [NSArray arrayWithObjects:c, s, nil];

Page 12: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{ self = [super initWithNibName:nibNameOrNil

bundle:nibBundleOrNil]; if (self) { self.title = @"ViewController"; self.tabBarItem.image = [UIImage imageNamed:@"1.png"]; } return self;}

Page 13: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение
Page 14: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение

UIPageViewController

Page 15: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение

Модальный контроллер

ViewController *v = [[ViewController alloc] init];[self presentModalViewController:v animated:YES];

[self dismissModalViewControllerAnimated:YES];

Page 16: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение

StoryBoard(демонстрация)

Page 17: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение

Модальные View

Page 18: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение

UIAlertView

UIAlertView *a = [[UIAlertView alloc] initWithTitle:@"test" message:@"message" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];[a show];

Page 19: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение

UIAlertView

- (void)viewDidLoad{ UIAlertView *a = [[UIAlertView alloc] initWithTitle:@"test" message:@"message" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:@"1", @"2", nil]; [a show];}

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{ NSLog(@"%d", buttonIndex);}

Page 20: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение

UIActionSheet

Page 21: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение

UIActionSheet

- (void)viewDidLoad{ UIActionSheet *s = [[UIActionSheet alloc] initWithTitle:@"test" delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:@"Delete" otherButtonTitles:@"One", @"Two", nil]; [s showInView:self.view];}

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex{ NSLog(@"button %d", buttonIndex);}

Page 22: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение

Варианты интерфейсов

Page 23: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение

http://mobile-patterns.com

Page 24: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение

Tabs

Page 25: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение

Dashboard

Page 26: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение

UITableView + UINavigationController

Гид Покупок: Продукты

Page 27: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение

Widget

Клуб Любителей Аудиокниг

Page 28: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение

Нестандартные интерфейсы

News360

Page 29: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение

Распознавание жестов

Page 31: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение

UITapGestureRecognizerUITapGestureRecognizer *t = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapped)];t.numberOfTapsRequired = 1;t.numberOfTouchesRequired = 1;[self.view addGestureRecognizer:t];

Page 32: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение

UIPanGestureRecognizerUIPanGestureRecognizer *p = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)];[self.view addGestureRecognizer:p];

- (void)pan:(UIPanGestureRecognizer *)sender{ CGPoint t = [sender translationInView:self.view]; CGPoint v = [sender velocityInView:self.view]; NSLog(@"%@", NSStringFromCGPoint(t)); NSLog(@"%@", NSStringFromCGPoint(v));}

Page 33: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение

UIPinchGestureRecognizerUIPinchGestureRecognizer *pinch = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinch:)];[self.view addGestureRecognizer:pinch];

- (void)pinch:(UIPinchGestureRecognizer *)sender{ CGFloat scale = sender.scale; NSLog(@"%g", scale);}

Page 34: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение

UIRotationGestureRecognizerUIRotationGestureRecognizer *r = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotate:)];[self.view addGestureRecognizer:r];

- (void)rotate:(UIRotationGestureRecognizer *)sender{ CGFloat r = sender.rotation; NSLog(@"%g", r);}

Page 35: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение

• UISwipeGestureRecognizer • UILongPressGestureRecognizer

UISwipeGestureRecognizer *s = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)];s.direction = UISwipeGestureRecognizerDirectionLeft;[self.view addGestureRecognizer:s];

UILongPressGestureRecognizer *p = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)];p.minimumPressDuration = 0.5;[self.view addGestureRecognizer:p];

Page 36: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение

UIGestureRecognizerDelegate

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer;

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer: (UIGestureRecognizer *)otherGestureRecognizer;

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch;

Page 37: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение

UIGestureRecognizerState

typedef enum { UIGestureRecognizerStatePossible,

UIGestureRecognizerStateBegan,

UIGestureRecognizerStateChanged,

UIGestureRecognizerStateEnded,

UIGestureRecognizerStateCancelled, UIGestureRecognizerStateFailed, UIGestureRecognizerStateRecognized = UIGestureRecognizerStateEnded } UIGestureRecognizerState;

Page 38: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение

Анимация

Page 39: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение

[UIView beginAnimations:nil context:nil];[UIView setAnimationDuration:0.5];

self.view.frame = CGRectMake(100, 100, 50, 50);

[UIView commitAnimations];

[UIView beginAnimations:nil context:nil];self.view.alpha = 0;[UIView commitAnimations];

Page 40: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение

[UIView beginAnimations:nil context:nil];[UIView setAnimationDelegate:self];[UIView setAnimationDidStopSelector:@selector(animationFinished)];

self.view.alpha = 0;

[UIView commitAnimations];

- (void)animationFinished{ //...}

Page 41: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение

The following properties of the UIView class are animatable:@property frame@property bounds@property center@property transform@property alpha@property backgroundColor@property contentStretch

Page 42: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение

Блокиvoid(^b)(void) = ^{ NSLog(@"test");};

b();

NSInteger(^c)(CGFloat, NSString *) = ^(CGFloat p, NSString *s){ NSLog(@"test %g %@", p, s); return 10;};

NSInteger q = c(10.5, @"abc");

Page 43: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение

Циклы ссылокtypedef void(^BasicBlock)(void);…@property(copy, nonatomic) BasicBlock block;…self.block = ^{ [self updateWithQuestion];};

__weak ViewController *s = self;self.block = ^{ [s updateWithQuestion];};

Page 44: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение

Захват переменных__block NSInteger q = 123;

BasicBlock b = ^{ ++q; NSLog(@"%d", q);};

b(); // 124b(); // 125

Page 45: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение

Анимация с блоками[UIView animateWithDuration:0.3 animations:^{ self.view.alpha = 0;}]; [UIView animateWithDuration:0.3 animations:^{ self.view.alpha = 1; } completion:^(BOOL finished) { NSLog(@"animation finished"); }];

Page 46: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение

Удобства с блоками [BlockAlertView showTitle:@"Ошибка" text:@"Для изменения личных данных необходимо подключение к интернету." cancelButton:@"ОК" action:^{ [s.navigationController dismissModalViewControllerAnimated:YES]; }];

DDXMLElement *style = [[img.attributes where:^BOOL(id element) { DDXMLNode *attr = element; return [attr.name isEqualToString:@"style"];}] firstObject];

BlockTapGestureRecognizer *tap = [[BlockTapGestureRecognizer alloc] initWithAction:^{ [self dismissModalViewControllerAnimated:YES];}];[self.view addGestureRecognizer:tap];

Page 47: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение

Демонстрация

Page 48: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение

Примеры интерфейсов из живых приложений

Page 49: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение

Кастомный navBar

Page 50: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение

Несколько navBar items

Page 51: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение

Кастомный tabBar

Page 52: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение

Произвольный tabBar

Page 53: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение

Rich text

Page 54: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение

Вопросы

Page 55: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение

Что нужно сделать, чтобы распознать нажатие на UIView?

Page 56: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение

Что нужно сделать, чтобы распознать нажатие на UIView?

Создать UITapGestureRecognizer,добавить его через addGestureRecognizer.

Page 57: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение

Как по нажатию на кнопку анимированно передвинуть эту кнопку в другой угол экрана, а в конце анимации

изменить ее цвет?

Page 58: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение

Как по нажатию на кнопку анимированно передвинуть эту кнопку в другой угол экрана, а в конце анимации

изменить ее цвет?

С помощью метода UIView animateWithDuration.В блоке анимации изменить фрейм, в блоке completion изменить цвет.

Page 59: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение

Как во всем приложении поменять фон у UINavigationBar?

Page 60: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение

Как во всем приложении поменять фон у UINavigationBar?

Для iOS5 достаточно воспользоваться статическим свойством appearance у UINavigationBar.

Для iOS4 надо создать категорию и подменить метод - (void)drawRect:(CGRect)rect

Page 61: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение

Задание

• два таба

• список городов из файла

• при выборе строки: карта с указанием на этот город

• список сайтов из файла

• при выборе строки: страница в webView с этим сайтом

Кнопка «Инфо», по нажатию alert с вопросом «да/нет». Если да - открывается modalViewController c текстом «об авторе»

На всех экранах: