Школа-Студия разработки приложений для ios. 3 лекция....
TRANSCRIPT
![Page 1: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение](https://reader034.vdocuments.mx/reader034/viewer/2022052310/554c1eb0b4c905ec518b54d1/html5/thumbnails/1.jpg)
Интерфейсы, продолжение
Разработка приложений для iOS
Лекция 3
Глеб Тарасов
![Page 2: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение](https://reader034.vdocuments.mx/reader034/viewer/2022052310/554c1eb0b4c905ec518b54d1/html5/thumbnails/2.jpg)
Сложные контроллеры
![Page 3: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение](https://reader034.vdocuments.mx/reader034/viewer/2022052310/554c1eb0b4c905ec518b54d1/html5/thumbnails/3.jpg)
UINavigationController
![Page 4: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение](https://reader034.vdocuments.mx/reader034/viewer/2022052310/554c1eb0b4c905ec518b54d1/html5/thumbnails/4.jpg)
![Page 5: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение](https://reader034.vdocuments.mx/reader034/viewer/2022052310/554c1eb0b4c905ec518b54d1/html5/thumbnails/5.jpg)
ViewController *c = [[ViewController alloc] initWithNibName:@"ViewController"
bundle:nil];
UINavigationController *nc = [[UINavigationController alloc] initWithRootViewController:c];
![Page 6: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение](https://reader034.vdocuments.mx/reader034/viewer/2022052310/554c1eb0b4c905ec518b54d1/html5/thumbnails/6.jpg)
- (IBAction)buttonTapped{ UIViewController *c = [[SubViewController alloc] initWithNibName:@"SubViewController" bundle:nil];
[self.navigationController pushViewController:c animated:YES];}
![Page 7: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение](https://reader034.vdocuments.mx/reader034/viewer/2022052310/554c1eb0b4c905ec518b54d1/html5/thumbnails/7.jpg)
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{ self = [super initWithNibName:nibNameOrNil
bundle:nibBundleOrNil]; if (self) { self.title = @"ViewController"; } return self;}
![Page 8: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение](https://reader034.vdocuments.mx/reader034/viewer/2022052310/554c1eb0b4c905ec518b54d1/html5/thumbnails/8.jpg)
![Page 9: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение](https://reader034.vdocuments.mx/reader034/viewer/2022052310/554c1eb0b4c905ec518b54d1/html5/thumbnails/9.jpg)
UITabBarController
![Page 10: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение](https://reader034.vdocuments.mx/reader034/viewer/2022052310/554c1eb0b4c905ec518b54d1/html5/thumbnails/10.jpg)
![Page 11: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение](https://reader034.vdocuments.mx/reader034/viewer/2022052310/554c1eb0b4c905ec518b54d1/html5/thumbnails/11.jpg)
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 лекция. Интерфейсы, прололжение](https://reader034.vdocuments.mx/reader034/viewer/2022052310/554c1eb0b4c905ec518b54d1/html5/thumbnails/12.jpg)
- (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 лекция. Интерфейсы, прололжение](https://reader034.vdocuments.mx/reader034/viewer/2022052310/554c1eb0b4c905ec518b54d1/html5/thumbnails/13.jpg)
![Page 14: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение](https://reader034.vdocuments.mx/reader034/viewer/2022052310/554c1eb0b4c905ec518b54d1/html5/thumbnails/14.jpg)
UIPageViewController
![Page 15: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение](https://reader034.vdocuments.mx/reader034/viewer/2022052310/554c1eb0b4c905ec518b54d1/html5/thumbnails/15.jpg)
Модальный контроллер
ViewController *v = [[ViewController alloc] init];[self presentModalViewController:v animated:YES];
[self dismissModalViewControllerAnimated:YES];
![Page 16: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение](https://reader034.vdocuments.mx/reader034/viewer/2022052310/554c1eb0b4c905ec518b54d1/html5/thumbnails/16.jpg)
StoryBoard(демонстрация)
![Page 17: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение](https://reader034.vdocuments.mx/reader034/viewer/2022052310/554c1eb0b4c905ec518b54d1/html5/thumbnails/17.jpg)
Модальные View
![Page 18: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение](https://reader034.vdocuments.mx/reader034/viewer/2022052310/554c1eb0b4c905ec518b54d1/html5/thumbnails/18.jpg)
UIAlertView
UIAlertView *a = [[UIAlertView alloc] initWithTitle:@"test" message:@"message" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];[a show];
![Page 19: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение](https://reader034.vdocuments.mx/reader034/viewer/2022052310/554c1eb0b4c905ec518b54d1/html5/thumbnails/19.jpg)
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 лекция. Интерфейсы, прололжение](https://reader034.vdocuments.mx/reader034/viewer/2022052310/554c1eb0b4c905ec518b54d1/html5/thumbnails/20.jpg)
UIActionSheet
![Page 21: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение](https://reader034.vdocuments.mx/reader034/viewer/2022052310/554c1eb0b4c905ec518b54d1/html5/thumbnails/21.jpg)
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 лекция. Интерфейсы, прололжение](https://reader034.vdocuments.mx/reader034/viewer/2022052310/554c1eb0b4c905ec518b54d1/html5/thumbnails/22.jpg)
Варианты интерфейсов
![Page 24: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение](https://reader034.vdocuments.mx/reader034/viewer/2022052310/554c1eb0b4c905ec518b54d1/html5/thumbnails/24.jpg)
Tabs
![Page 25: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение](https://reader034.vdocuments.mx/reader034/viewer/2022052310/554c1eb0b4c905ec518b54d1/html5/thumbnails/25.jpg)
Dashboard
![Page 26: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение](https://reader034.vdocuments.mx/reader034/viewer/2022052310/554c1eb0b4c905ec518b54d1/html5/thumbnails/26.jpg)
UITableView + UINavigationController
Гид Покупок: Продукты
![Page 27: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение](https://reader034.vdocuments.mx/reader034/viewer/2022052310/554c1eb0b4c905ec518b54d1/html5/thumbnails/27.jpg)
Widget
Клуб Любителей Аудиокниг
![Page 28: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение](https://reader034.vdocuments.mx/reader034/viewer/2022052310/554c1eb0b4c905ec518b54d1/html5/thumbnails/28.jpg)
Нестандартные интерфейсы
News360
![Page 29: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение](https://reader034.vdocuments.mx/reader034/viewer/2022052310/554c1eb0b4c905ec518b54d1/html5/thumbnails/29.jpg)
Распознавание жестов
![Page 30: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение](https://reader034.vdocuments.mx/reader034/viewer/2022052310/554c1eb0b4c905ec518b54d1/html5/thumbnails/30.jpg)
UIGestureRecognizer
- (void)addGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
UIView:
![Page 31: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение](https://reader034.vdocuments.mx/reader034/viewer/2022052310/554c1eb0b4c905ec518b54d1/html5/thumbnails/31.jpg)
UITapGestureRecognizerUITapGestureRecognizer *t = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapped)];t.numberOfTapsRequired = 1;t.numberOfTouchesRequired = 1;[self.view addGestureRecognizer:t];
![Page 32: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение](https://reader034.vdocuments.mx/reader034/viewer/2022052310/554c1eb0b4c905ec518b54d1/html5/thumbnails/32.jpg)
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 лекция. Интерфейсы, прололжение](https://reader034.vdocuments.mx/reader034/viewer/2022052310/554c1eb0b4c905ec518b54d1/html5/thumbnails/33.jpg)
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 лекция. Интерфейсы, прололжение](https://reader034.vdocuments.mx/reader034/viewer/2022052310/554c1eb0b4c905ec518b54d1/html5/thumbnails/34.jpg)
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 лекция. Интерфейсы, прололжение](https://reader034.vdocuments.mx/reader034/viewer/2022052310/554c1eb0b4c905ec518b54d1/html5/thumbnails/35.jpg)
• 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 лекция. Интерфейсы, прололжение](https://reader034.vdocuments.mx/reader034/viewer/2022052310/554c1eb0b4c905ec518b54d1/html5/thumbnails/36.jpg)
UIGestureRecognizerDelegate
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer;
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer: (UIGestureRecognizer *)otherGestureRecognizer;
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch;
![Page 37: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение](https://reader034.vdocuments.mx/reader034/viewer/2022052310/554c1eb0b4c905ec518b54d1/html5/thumbnails/37.jpg)
UIGestureRecognizerState
typedef enum { UIGestureRecognizerStatePossible,
UIGestureRecognizerStateBegan,
UIGestureRecognizerStateChanged,
UIGestureRecognizerStateEnded,
UIGestureRecognizerStateCancelled, UIGestureRecognizerStateFailed, UIGestureRecognizerStateRecognized = UIGestureRecognizerStateEnded } UIGestureRecognizerState;
![Page 38: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение](https://reader034.vdocuments.mx/reader034/viewer/2022052310/554c1eb0b4c905ec518b54d1/html5/thumbnails/38.jpg)
Анимация
![Page 39: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение](https://reader034.vdocuments.mx/reader034/viewer/2022052310/554c1eb0b4c905ec518b54d1/html5/thumbnails/39.jpg)
[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 лекция. Интерфейсы, прололжение](https://reader034.vdocuments.mx/reader034/viewer/2022052310/554c1eb0b4c905ec518b54d1/html5/thumbnails/40.jpg)
[UIView beginAnimations:nil context:nil];[UIView setAnimationDelegate:self];[UIView setAnimationDidStopSelector:@selector(animationFinished)];
self.view.alpha = 0;
[UIView commitAnimations];
- (void)animationFinished{ //...}
![Page 41: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение](https://reader034.vdocuments.mx/reader034/viewer/2022052310/554c1eb0b4c905ec518b54d1/html5/thumbnails/41.jpg)
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 лекция. Интерфейсы, прололжение](https://reader034.vdocuments.mx/reader034/viewer/2022052310/554c1eb0b4c905ec518b54d1/html5/thumbnails/42.jpg)
Блоки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 лекция. Интерфейсы, прололжение](https://reader034.vdocuments.mx/reader034/viewer/2022052310/554c1eb0b4c905ec518b54d1/html5/thumbnails/43.jpg)
Циклы ссылок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 лекция. Интерфейсы, прололжение](https://reader034.vdocuments.mx/reader034/viewer/2022052310/554c1eb0b4c905ec518b54d1/html5/thumbnails/44.jpg)
Захват переменных__block NSInteger q = 123;
BasicBlock b = ^{ ++q; NSLog(@"%d", q);};
b(); // 124b(); // 125
![Page 45: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение](https://reader034.vdocuments.mx/reader034/viewer/2022052310/554c1eb0b4c905ec518b54d1/html5/thumbnails/45.jpg)
Анимация с блоками[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 лекция. Интерфейсы, прололжение](https://reader034.vdocuments.mx/reader034/viewer/2022052310/554c1eb0b4c905ec518b54d1/html5/thumbnails/46.jpg)
Удобства с блоками [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 лекция. Интерфейсы, прололжение](https://reader034.vdocuments.mx/reader034/viewer/2022052310/554c1eb0b4c905ec518b54d1/html5/thumbnails/47.jpg)
Демонстрация
![Page 48: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение](https://reader034.vdocuments.mx/reader034/viewer/2022052310/554c1eb0b4c905ec518b54d1/html5/thumbnails/48.jpg)
Примеры интерфейсов из живых приложений
![Page 49: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение](https://reader034.vdocuments.mx/reader034/viewer/2022052310/554c1eb0b4c905ec518b54d1/html5/thumbnails/49.jpg)
Кастомный navBar
![Page 50: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение](https://reader034.vdocuments.mx/reader034/viewer/2022052310/554c1eb0b4c905ec518b54d1/html5/thumbnails/50.jpg)
Несколько navBar items
![Page 51: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение](https://reader034.vdocuments.mx/reader034/viewer/2022052310/554c1eb0b4c905ec518b54d1/html5/thumbnails/51.jpg)
Кастомный tabBar
![Page 52: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение](https://reader034.vdocuments.mx/reader034/viewer/2022052310/554c1eb0b4c905ec518b54d1/html5/thumbnails/52.jpg)
Произвольный tabBar
![Page 53: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение](https://reader034.vdocuments.mx/reader034/viewer/2022052310/554c1eb0b4c905ec518b54d1/html5/thumbnails/53.jpg)
Rich text
![Page 54: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение](https://reader034.vdocuments.mx/reader034/viewer/2022052310/554c1eb0b4c905ec518b54d1/html5/thumbnails/54.jpg)
Вопросы
![Page 55: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение](https://reader034.vdocuments.mx/reader034/viewer/2022052310/554c1eb0b4c905ec518b54d1/html5/thumbnails/55.jpg)
Что нужно сделать, чтобы распознать нажатие на UIView?
![Page 56: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение](https://reader034.vdocuments.mx/reader034/viewer/2022052310/554c1eb0b4c905ec518b54d1/html5/thumbnails/56.jpg)
Что нужно сделать, чтобы распознать нажатие на UIView?
Создать UITapGestureRecognizer,добавить его через addGestureRecognizer.
![Page 57: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение](https://reader034.vdocuments.mx/reader034/viewer/2022052310/554c1eb0b4c905ec518b54d1/html5/thumbnails/57.jpg)
Как по нажатию на кнопку анимированно передвинуть эту кнопку в другой угол экрана, а в конце анимации
изменить ее цвет?
![Page 58: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение](https://reader034.vdocuments.mx/reader034/viewer/2022052310/554c1eb0b4c905ec518b54d1/html5/thumbnails/58.jpg)
Как по нажатию на кнопку анимированно передвинуть эту кнопку в другой угол экрана, а в конце анимации
изменить ее цвет?
С помощью метода UIView animateWithDuration.В блоке анимации изменить фрейм, в блоке completion изменить цвет.
![Page 59: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение](https://reader034.vdocuments.mx/reader034/viewer/2022052310/554c1eb0b4c905ec518b54d1/html5/thumbnails/59.jpg)
Как во всем приложении поменять фон у UINavigationBar?
![Page 60: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение](https://reader034.vdocuments.mx/reader034/viewer/2022052310/554c1eb0b4c905ec518b54d1/html5/thumbnails/60.jpg)
Как во всем приложении поменять фон у UINavigationBar?
Для iOS5 достаточно воспользоваться статическим свойством appearance у UINavigationBar.
Для iOS4 надо создать категорию и подменить метод - (void)drawRect:(CGRect)rect
![Page 61: Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение](https://reader034.vdocuments.mx/reader034/viewer/2022052310/554c1eb0b4c905ec518b54d1/html5/thumbnails/61.jpg)
Задание
• два таба
• список городов из файла
• при выборе строки: карта с указанием на этот город
• список сайтов из файла
• при выборе строки: страница в webView с этим сайтом
Кнопка «Инфо», по нажатию alert с вопросом «да/нет». Если да - открывается modalViewController c текстом «об авторе»
На всех экранах: