Установка корпоративных программ в ОС iOS — Служба поддержки Apple (RU)

Установка корпоративных программ в ОС iOS - Служба поддержки Apple (RU) Без рубрики

А что это вообще за «developer» в настройках iphone или ipad?

Если быть кратким, то это специальный раздел, который появляется при установке сертификата разработчика, разработке собственного приложения или использования сторонних инструментов для работы с вашим iPhone или iPad.

Developer = Разработчик.

Зачем он нужен?

  1. Сбор статистики конкретного приложения (из-за которого и появился «Developer»).
  2. Тестирования работы и анализа данных этого самого приложения.

В общем, штука исключительно для разработчиков и к обычному пользователю имеет самое опосредованное отношение.

Вступление

Всем привет, меня зовут Григорий, последние 5 лет занимался программированием под iOS. Сейчас решил сменить сферу деятельности и ударился в веб, но чтобы добро не пропадало, хочу поделиться с сообществом своими наработками, накопившимися за это время.

Минимальная поддерживаемая версия — iOS 6.0.

UIAlertView — один из часто используемых компонентов при разработке на iOS. Выглядит и работает из коробки замечательно, проблема в том, что возможностей кастомизировать его Apple практически не дает, есть только несколько стандартно заданных стилей отображения.

А что если нам нужно вставить внутрь свою вьюху, или банально поменять цвет кнопок или фона? Вот и было принято решение написать универсальный класс, который повторял бы работу UIAlertView, но имел широкие возможности по настройке. Так и появился LGAlertView.

При инициализации у нас есть возможность выбора между несколькими стилями:

Для возможности отлавливать события есть несколько путей: делегирование, как в стандартном UIAlertView, и блоки (кому как больше нравится). Кроме того, предусмотрены NSNotification для появления и исчезновения LGAlertView с экрана. Сначала думал добавить нотификации и для кнопок, но решил, что все-таки это будет лишним.

Немного кода

Делегирование:

@property (assign, nonatomic) id<LGAlertViewDelegate> delegate;

- (void)alertViewWillShow:(LGAlertView *)alertView;
- (void)alertViewWillDismiss:(LGAlertView *)alertView;
- (void)alertViewDidShow:(LGAlertView *)alertView;
- (void)alertViewDidDismiss:(LGAlertView *)alertView;
- (void)alertView:(LGAlertView *)alertView buttonPressedWithTitle:(NSString *)title index:(NSUInteger)index;
- (void)alertViewCancelled:(LGAlertView *)alertView;
- (void)alertViewDestructiveButtonPressed:(LGAlertView *)alertView;

Блоки:

@property (strong, nonatomic) void (^willShowHandler)(LGAlertView *alertView);
@property (strong, nonatomic) void (^willDismissHandler)(LGAlertView *alertView);
@property (strong, nonatomic) void (^didShowHandler)(LGAlertView *alertView);
@property (strong, nonatomic) void (^didDismissHandler)(LGAlertView *alertView);
@property (strong, nonatomic) void (^actionHandler)(LGAlertView *alertView, NSString *title, NSUInteger index);
@property (strong, nonatomic) void (^cancelHandler)(LGAlertView *alertView, BOOL onButton);
@property (strong, nonatomic) void (^destructiveHandler)(LGAlertView *alertView);

NSNotifications:

kLGAlertViewWillShowNotification;
kLGAlertViewWillDismissNotification;
kLGAlertViewDidShowNotification;
kLGAlertViewDidDismissNotification;

Для настройки внешнего вида есть много свойств. Перечислять их долго, думаю из названий должно быть все понятно:

Немного кода
/** Default is YES */
@property (assign, nonatomic, getter=isCancelOnTouch) BOOL cancelOnTouch;
/** Set highlighted buttons background color to blue, and set highlighted destructive button background color to red. Default is YES */
@property (assign, nonatomic, getter=isColorful) BOOL colorful;

@property (strong, nonatomic) UIColor *tintColor;
@property (strong, nonatomic) UIColor *coverColor;
@property (strong, nonatomic) UIColor *backgroundColor;
@property (assign, nonatomic) CGFloat layerCornerRadius;
@property (strong, nonatomic) UIColor *layerBorderColor;
@property (assign, nonatomic) CGFloat layerBorderWidth;
@property (strong, nonatomic) UIColor *layerShadowColor;
@property (assign, nonatomic) CGFloat layerShadowRadius;

@property (assign, nonatomic) CGFloat heightMax;
@property (assign, nonatomic) CGFloat widthMax;

@property (strong, nonatomic) UIColor         *titleTextColor;
@property (assign, nonatomic) NSTextAlignment titleTextAlignment;
@property (strong, nonatomic) UIFont          *titleFont;

@property (strong, nonatomic) UIColor         *messageTextColor;
@property (assign, nonatomic) NSTextAlignment messageTextAlignment;
@property (strong, nonatomic) UIFont          *messageFont;

@property (strong, nonatomic) UIColor         *buttonsTitleColor;
@property (strong, nonatomic) UIColor         *buttonsTitleColorHighlighted;
@property (assign, nonatomic) NSTextAlignment buttonsTextAlignment;
@property (strong, nonatomic) UIFont          *buttonsFont;
@property (strong, nonatomic) UIColor         *buttonsBackgroundColorHighlighted;
@property (assign, nonatomic) NSUInteger      buttonsNumberOfLines;
@property (assign, nonatomic) NSLineBreakMode buttonsLineBreakMode;
@property (assign, nonatomic) BOOL            buttonsAdjustsFontSizeToFitWidth;
@property (assign, nonatomic) CGFloat         buttonsMinimumScaleFactor;

@property (strong, nonatomic) UIColor         *cancelButtonTitleColor;
@property (strong, nonatomic) UIColor         *cancelButtonTitleColorHighlighted;
@property (assign, nonatomic) NSTextAlignment cancelButtonTextAlignment;
@property (strong, nonatomic) UIFont          *cancelButtonFont;
@property (strong, nonatomic) UIColor         *cancelButtonBackgroundColorHighlighted;
@property (assign, nonatomic) NSUInteger      cancelButtonNumberOfLines;
@property (assign, nonatomic) NSLineBreakMode cancelButtonLineBreakMode;
@property (assign, nonatomic) BOOL            cancelButtonAdjustsFontSizeToFitWidth;
@property (assign, nonatomic) CGFloat         cancelButtonMinimumScaleFactor;

@property (strong, nonatomic) UIColor         *destructiveButtonTitleColor;
@property (strong, nonatomic) UIColor         *destructiveButtonTitleColorHighlighted;
@property (assign, nonatomic) NSTextAlignment destructiveButtonTextAlignment;
@property (strong, nonatomic) UIFont          *destructiveButtonFont;
@property (strong, nonatomic) UIColor         *destructiveButtonBackgroundColorHighlighted;
@property (assign, nonatomic) NSUInteger      destructiveButtonNumberOfLines;
@property (assign, nonatomic) NSLineBreakMode destructiveButtonLineBreakMode;
@property (assign, nonatomic) BOOL            destructiveButtonAdjustsFontSizeToFitWidth;
@property (assign, nonatomic) CGFloat         destructiveButtonMinimumScaleFactor;

@property (assign, nonatomic) UIActivityIndicatorViewStyle activityIndicatorViewStyle;
@property (strong, nonatomic) UIColor                      *activityIndicatorViewColor;

@property (strong, nonatomic) UIColor *progressViewProgressTintColor;
@property (strong, nonatomic) UIColor *progressViewTrackTintColor;
@property (strong, nonatomic) UIImage *progressViewProgressImage;
@property (strong, nonatomic) UIImage *progressViewTrackImage;

@property (strong, nonatomic) UIColor         *progressLabelTextColor;
@property (assign, nonatomic) NSTextAlignment progressLabelTextAlignment;
@property (strong, nonatomic) UIFont          *progressLabelFont;

@property (strong, nonatomic) UIColor *separatorsColor;

@property (assign, nonatomic) UIScrollViewIndicatorStyle indicatorStyle;


Чтобы показывать или скрывать LGAlertView предусмотрены следующие методы:

- (void)showAnimated:(BOOL)animated completionHandler:(void(^)())completionHandler;
- (void)dismissAnimated:(BOOL)animated completionHandler:(void(^)())completionHandler;

Кроме того удалось добиться правильного поведения в случае, когда появляется несколько вьюх подряд без закрытия предыдущих. Вы можете не боясь комбинировать UIAlertView, UIActionSheet, LGAlertView и LGActionSheet. При появлении новых старые будут исчезать, а при исчезновении — появляться.

Причины появления и принцип действия аналогичны LGAlertView.

Стили при инициализации:

События отлавливаются с помощью делегирования, блоков и нотификаций:

Немного кода

Делегирование:

@property (assign, nonatomic) id<LGActionSheetDelegate> delegate;

- (void)actionSheetWillShow:(LGActionSheet *)actionSheet;
- (void)actionSheetWillDismiss:(LGActionSheet *)actionSheet;
- (void)actionSheetDidShow:(LGActionSheet *)actionSheet;
- (void)actionSheetDidDismiss:(LGActionSheet *)actionSheet;
- (void)actionSheet:(LGActionSheet *)actionSheet buttonPressedWithTitle:(NSString *)title index:(NSUInteger)index;
- (void)actionSheetCancelled:(LGActionSheet *)actionSheet;
- (void)actionSheetDestructiveButtonPressed:(LGActionSheet *)actionSheet;

Блоки:

@property (strong, nonatomic) void (^willShowHandler)(LGActionSheet *actionSheet);
@property (strong, nonatomic) void (^willDismissHandler)(LGActionSheet *actionSheet);
@property (strong, nonatomic) void (^didShowHandler)(LGActionSheet *actionSheet);
@property (strong, nonatomic) void (^didDismissHandler)(LGActionSheet *actionSheet);
@property (strong, nonatomic) void (^actionHandler)(LGActionSheet *actionSheet, NSString *title, NSUInteger index);
@property (strong, nonatomic) void (^cancelHandler)(LGActionSheet *actionSheet, BOOL onButton);
@property (strong, nonatomic) void (^destructiveHandler)(LGActionSheet *actionSheet);

NSNotifications:

kLGActionSheetWillShowNotification;
kLGActionSheetWillDismissNotification;
kLGActionSheetDidShowNotification;
kLGActionSheetDidDismissNotification;

Настройка внешнего вида и анимаций (по умолчанию анимации для iPhone и iPad различается):

Немного кода
@property (assign, nonatomic) LGActionSheetTransitionStyle transitionStyle;

/** Default is YES */
@property (assign, nonatomic, getter=isCancelOnTouch) BOOL cancelOnTouch;
/** Set highlighted buttons background color to blue, and set highlighted destructive button background color to red. Default is YES */
@property (assign, nonatomic, getter=isColorful) BOOL colorful;

@property (strong, nonatomic) UIColor *tintColor;
@property (strong, nonatomic) UIColor *coverColor;
@property (strong, nonatomic) UIColor *backgroundColor;
@property (assign, nonatomic) CGFloat layerCornerRadius;
@property (strong, nonatomic) UIColor *layerBorderColor;
@property (assign, nonatomic) CGFloat layerBorderWidth;
@property (strong, nonatomic) UIColor *layerShadowColor;
@property (assign, nonatomic) CGFloat layerShadowRadius;

@property (assign, nonatomic) CGFloat heightMax;
@property (assign, nonatomic) CGFloat widthMax;

@property (strong, nonatomic) UIColor         *titleTextColor;
@property (assign, nonatomic) NSTextAlignment titleTextAlignment;
@property (strong, nonatomic) UIFont          *titleFont;

@property (strong, nonatomic) UIColor         *buttonsTitleColor;
@property (strong, nonatomic) UIColor         *buttonsTitleColorHighlighted;
@property (assign, nonatomic) NSTextAlignment buttonsTextAlignment;
@property (strong, nonatomic) UIFont          *buttonsFont;
@property (strong, nonatomic) UIColor         *buttonsBackgroundColorHighlighted;
@property (assign, nonatomic) NSUInteger      buttonsNumberOfLines;
@property (assign, nonatomic) NSLineBreakMode buttonsLineBreakMode;
@property (assign, nonatomic) BOOL            buttonsAdjustsFontSizeToFitWidth;
@property (assign, nonatomic) CGFloat         buttonsMinimumScaleFactor;

@property (strong, nonatomic) UIColor         *cancelButtonTitleColor;
@property (strong, nonatomic) UIColor         *cancelButtonTitleColorHighlighted;
@property (assign, nonatomic) NSTextAlignment cancelButtonTextAlignment;
@property (strong, nonatomic) UIFont          *cancelButtonFont;
@property (strong, nonatomic) UIColor         *cancelButtonBackgroundColorHighlighted;
@property (assign, nonatomic) NSUInteger      cancelButtonNumberOfLines;
@property (assign, nonatomic) NSLineBreakMode cancelButtonLineBreakMode;
@property (assign, nonatomic) BOOL            cancelButtonAdjustsFontSizeToFitWidth;
@property (assign, nonatomic) CGFloat         cancelButtonMinimumScaleFactor;

@property (strong, nonatomic) UIColor         *destructiveButtonTitleColor;
@property (strong, nonatomic) UIColor         *destructiveButtonTitleColorHighlighted;
@property (assign, nonatomic) NSTextAlignment destructiveButtonTextAlignment;
@property (strong, nonatomic) UIFont          *destructiveButtonFont;
@property (strong, nonatomic) UIColor         *destructiveButtonBackgroundColorHighlighted;
@property (assign, nonatomic) NSUInteger      destructiveButtonNumberOfLines;
@property (assign, nonatomic) NSLineBreakMode destructiveButtonLineBreakMode;
@property (assign, nonatomic) BOOL            destructiveButtonAdjustsFontSizeToFitWidth;
@property (assign, nonatomic) CGFloat         destructiveButtonMinimumScaleFactor;

@property (strong, nonatomic) UIColor *separatorsColor;

@property (assign, nonatomic) UIScrollViewIndicatorStyle indicatorStyle;

Читайте также:  Как изменить размер приложений рабочего стола на iPadOS |

Чтобы показывать или скрывать LGActionSheet предусмотрены следующие методы:

- (void)showAnimated:(BOOL)animated completionHandler:(void(^)())completionHandler;
- (void)dismissAnimated:(BOOL)animated completionHandler:(void(^)())completionHandler;


Без выезжающих боковых меню в наше время не обходится практически ни одно серьезное приложение. В какой-то момент надоело писать для каждого проекта разовые решения и была создана данная библиотека.

Краткий список возможностей:

Добавить данный контроллер в проект довольно просто. Нужно указать ваш корневой контроллер (обычно это UINavigationController) как корневой контроллер LGSideMenuController’a… звучит немного тавтологично, приведу пример:

Обычная инициализация корневого контроллера в AppDelegate.m:

ViewController *viewController = [ViewController new];

UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:viewController];

window.rootViewController = navigationController;

Инициализация с LGSideMenuController’ом:

ViewController *viewController = [ViewController new];

UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:viewController];

LGSideMenuController *sideMenuController = [[LGSideMenuController alloc] initWithRootViewController:navigationController];

window.rootViewController = sideMenuController;

Настроить боковые меню тоже не сложно. Сначала необходимо включить те меню, которые вам нужны (левое, правое или обе):

[sideMenuController setLeftViewEnabledWithWidth:250.f // необходимая ширина области
presentationStyle:LGSideMenuPresentationStyleScaleFromBig // стиль анимации
alwaysVisibleOptions:0]; // правила показа


Далее добавьте свои вьюхи, которые будут показываться в боковом меню:

TableViewController *leftViewController = [TableViewController new];

[sideMenuController.leftView addSubview:leftViewController.tableView];

Чтобы показывать или скрывать боковые меню предусмотрены следующие методы:

- (void)showLeftViewAnimated:(BOOL)animated completionHandler:(void(^)())completionHandler;
- (void)hideLeftViewAnimated:(BOOL)animated completionHandler:(void(^)())completionHandler;
- (void)showHideLeftViewAnimated:(BOOL)animated completionHandler:(void(^)())completionHandler;

- (void)showRightViewAnimated:(BOOL)animated completionHandler:(void(^)())completionHandler;
- (void)hideRightViewAnimated:(BOOL)animated completionHandler:(void(^)())completionHandler;
- (void)showHideRightViewAnimated:(BOOL)animated completionHandler:(void(^)())completionHandler;

Также присутствуют следующие NSNotifications:

kLGSideMenuControllerWillShowLeftViewNotification;
kLGSideMenuControllerWillDismissLeftViewNotification;
kLGSideMenuControllerDidShowLeftViewNotification;
kLGSideMenuControllerDidDismissLeftViewNotification;

kLGSideMenuControllerWillShowRightViewNotification;
kLGSideMenuControllerWillDismissRightViewNotification;
kLGSideMenuControllerDidShowRightViewNotification;
kLGSideMenuControllerDidDismissRightViewNotification;

Google последнее время активно продвигает свой Material Design, одним из компонентов которого является кнопка » «, вызывающая какие-либо дополнительные опции. Решение довольно интересное. На моей практике был заказчик, который просил подобный функционал реализовать на iOS. Поэтому тянуть резину не стал и сразу решил написать универсальное решение.

Краткий список возможностей:

Инициализация:

- (instancetype)initWithView:(UIView *)view
numberOfButtons:(NSUInteger)numberOfButtons
showsPlusButton:(BOOL)showsPlusButton;

События отлавливаются с помощью делегирования или блоков:


Настройка внешнего вида и анимаций:

Немного кода
@property (assign, nonatomic, getter=isShowWhenScrolling) BOOL showWhenScrolling;

@property (strong, nonatomic) LGPlusButton *plusButton;

/** First is plusButton */
@property (strong, nonatomic) NSMutableArray *buttons;
/** First is plusButton description */
@property (strong, nonatomic) NSMutableArray *descriptions;

@property (assign, nonatomic) UIEdgeInsets contentInset;
@property (assign, nonatomic) UIEdgeInsets buttonInset;
@property (assign, nonatomic) CGSize       buttonsSize;
@property (assign, nonatomic) CGSize       plusButtonSize;
/** Description horizontal offset from button, default is 6.f */
@property (assign, nonatomic) CGFloat      descriptionOffsetX;

@property (assign, nonatomic) LGPlusButtonsAppearingAnimationType appearingAnimationType;
@property (assign, nonatomic) LGPlusButtonsAppearingAnimationType buttonsAppearingAnimationType;
@property (assign, nonatomic) LGPlusButtonAnimationType           plusButtonAnimationType;
@property (assign, nonatomic) LGPlusButtonsViewPosition           position;

- (void)setButtonsTitles:(NSArray *)titles forState:(UIControlState)state;
- (void)setButtonsTitleColor:(UIColor *)titleColor forState:(UIControlState)state;
- (void)setButtonsImage:(UIImage *)image forState:(UIControlState)state;
- (void)setButtonsBackgroundImage:(UIImage *)backgroundImage forState:(UIControlState)state;
- (void)setButtonsBackgroundColor:(UIColor *)backgroundColor forState:(UIControlState)state;
- (void)setButtonsTitleFont:(UIFont *)font;

- (void)setDescriptionsTexts:(NSArray *)texts;
- (void)setDescriptionsTextColor:(UIColor *)textColor;
- (void)setDescriptionsBackgroundColor:(UIColor *)backgroundColor;
- (void)setDescriptionsFont:(UIFont *)font;

- (void)setButtonsClipsToBounds:(BOOL)clipsToBounds;
- (void)setButtonsContentEdgeInsets:(UIEdgeInsets)contentEdgeInsets;
- (void)setButtonsAdjustsImageWhenHighlighted:(BOOL)adjustsImageWhenHighlighted;

- (void)setButtonsLayerMasksToBounds:(BOOL)masksToBounds;
- (void)setButtonsLayerCornerRadius:(CGFloat)cornerRadius;
- (void)setButtonsLayerBorderColor:(UIColor *)borderColor borderWidth:(CGFloat)borderWidth;
- (void)setButtonsLayerShadowColor:(UIColor *)shadowColor shadowOpacity:(float)shadowOpacity shadowOffset:(CGSize)shadowOffset shadowRadius:(CGFloat)shadowRadius;

Чтобы показывать или скрывать LGPlusButtonsView, предусмотрены следующие методы:

// для всех кнопок, включая кнопку " "
- (void)showAnimated:(BOOL)animated completionHandler:(void(^)())completionHandler;
- (void)hideAnimated:(BOOL)animated completionHandler:(void(^)())completionHandler;

// только дополнительные кнопки
- (void)showButtonsAnimated:(BOOL)animated completionHandler:(void(^)())completionHandler;
- (void)hideButtonsAnimated:(BOOL)animated completionHandler:(void(^)())completionHandler;

Довольно часто в новостных приложениях приходится делать фильтры, к примеру, для выбора категории выводимых материалов. Логика у них вполне похожа, обычно это выпадающая таблица с названиями. Данный функционал и реализует LGFilterView.

Краткий список возможностей:


Инициализировать можно либо со списком возможных названий (тогда фильтр будет выглядеть как таблица), либо со своей кастомной вьюхой (которую фильтр будет показывать):

- (instancetype)initWithView:(UIView *)view;
- (instancetype)initWithTitles:(NSArray *)titles;

События отлавливаются с помощью делегирования, блоков и нотификаций:

Немного кода

Делегирование:

@property (assign, nonatomic) id<LGFilterViewDelegate> delegate;

- (void)filterViewWillShow:(LGFilterView *)filterView;
- (void)filterViewWillDismiss:(LGFilterView *)filterView;
- (void)filterViewDidShow:(LGFilterView *)filterView;
- (void)filterViewDidDismiss:(LGFilterView *)filterView;
- (void)filterView:(LGFilterView *)filterView buttonPressedWithTitle:(NSString *)title index:(NSUInteger)index;
- (void)filterViewCancelled:(LGFilterView *)filterView;

Блоки:

@property (strong, nonatomic) void (^willShowHandler)(LGFilterView *filterView);
@property (strong, nonatomic) void (^willDismissHandler)(LGFilterView *filterView);
@property (strong, nonatomic) void (^didShowHandler)(LGFilterView *filterView);
@property (strong, nonatomic) void (^didDismissHandler)(LGFilterView *filterView);
@property (strong, nonatomic) void (^actionHandler)(LGFilterView *filterView, NSString *title, NSUInteger index);
@property (strong, nonatomic) void (^cancelHandler)(LGFilterView *filterView);

NSNotifications:

kLGFilterViewWillShowNotification;
kLGFilterViewWillDismissNotification;
kLGFilterViewDidShowNotification;
kLGFilterViewDidDismissNotification;

Настройка внешнего вида и анимаций (по умолчанию анимации для iPhone и iPad различается):

Немного кода
@property (assign, nonatomic) LGFilterViewTransitionStyle transitionStyle;

@property (assign, nonatomic) CGPoint      offset;
@property (assign, nonatomic) UIEdgeInsets contentInset;
@property (assign, nonatomic) CGFloat      heightMax;

@property (assign, nonatomic, getter=isSeparatorsVisible) BOOL separatorsVisible;
@property (strong, nonatomic) UIColor      *separatorsColor;
@property (assign, nonatomic) UIEdgeInsets separatorsEdgeInsets;

@property (strong, nonatomic) UIColor *titleColor;
@property (strong, nonatomic) UIColor *titleColorHighlighted;
@property (strong, nonatomic) UIColor *titleColorSelected;

@property (strong, nonatomic) UIColor *backgroundColorHighlighted;
@property (strong, nonatomic) UIColor *backgroundColorSelected;

@property (strong, nonatomic) UIFont          *font;
@property (assign, nonatomic) NSUInteger      numberOfLines;
@property (assign, nonatomic) NSLineBreakMode lineBreakMode;
@property (assign, nonatomic) NSTextAlignment textAlignment;
@property (assign, nonatomic) BOOL            adjustsFontSizeToFitWidth;
@property (assign, nonatomic) CGFloat         minimumScaleFactor;

@property (assign, nonatomic) CGFloat cornerRadius;
@property (assign, nonatomic) CGFloat borderWidth;
@property (strong, nonatomic) UIColor *borderColor;

@property (assign, nonatomic) UIScrollViewIndicatorStyle indicatorStyle;


Чтобы показывать или скрывать фильтр предусмотрены следующие методы:

- (void)showInView:(UIView *)view animated:(BOOL)animated completionHandler:(void(^)())completionHandler;
- (void)dismissAnimated:(BOOL)animated completionHandler:(void(^)())completionHandler;

«Потяни, чтобы обновить» — очень модная фича, которая есть практически в каждом приложении. Даже Apple не удержалась и в iOS 6 добавила данный функционал, но почему-то только для UITableView, а UICollectionView и UIScrollView остались за бортом. Хотя при помощи некоторых костылей стандартный «pull to refresh» можно прикрутить и для UICollectionView, но костыли нам не нужны.

По правде сказать различных «рефрешей» полно на гитхабе, сам долго искал подходящий, но в основном там либо заброшенные популярные старые версии, у которых накопился ворох различных проблем, или очень крутые библиотеки, которые делают просто невообразимые вещи, но слишком изощрены в дизайне, чтобы была возможность использовать их в любом проекте. Поэтому решил постараться сделать универсальный, кастомизируемый и нейтральный «pull to refresh».

При инициализации нужно указать родительскую вьюху, которая должна быть UIScrollView или наследуемым классом (UITableView или UICollectionView. По идее должно работать и с UIWebView, но во время тестов были проблемы, поэтому не советую).

- (instancetype)initWithScrollView:(UIScrollView *)scrollView;

Событие рефреша отлавливается с помощью делегирования, блоков и нотификаций:

Читайте также:  Планшет Apple iPad 4 32Gb Wi-Fi Cellular White MD526: купить планшет Эпл в интернет-магазине Эльдорадо, цены с доставкой по Москве

Для завершения обновления предусмотрен метод:

- (void)endRefreshing;


Также рефреш можно вызвать программно:

- (void)triggerAnimated:(BOOL)animated;

Если у вас клиент-серверное приложение, то при переходе на новый контроллер часто приходится загружать данные. Чтобы не фризить UI, делать это нужно в дополнительном потоке. Но что показывать пользователю, пока происходит загрузка? А показывать можно разное, для этого и сделан LGPlaceholderView.

Что LGPlaceholderView может показывать:

Кроме того, LGPlaceholderView всегда будет находиться поверх других вьюх. Вы можете загрузить данные, подготовить их к показу, а потом анимированно скрыть LGPlaceholderView.

При инициализации нужно указать вьюху, которую вы будете скрывать:

- (instancetype)initWithView:(UIView *)view;

События можно отлавливать с помощью нотификаций:

kLGPlaceholderViewWillShowNotification;
kLGPlaceholderViewWillDismissNotification;
kLGPlaceholderViewDidShowNotification;
kLGPlaceholderViewDidDismissNotification;

Для показа предусмотрены различные методы, в зависимости от того, какой стиль вы хотите задать:

- (void)showActivityIndicatorAnimated:(BOOL)animated completionHandler:(void(^)())completionHandler;
- (void)showActivityIndicatorWithText:(NSString *)text animated:(BOOL)animated completionHandler:(void(^)())completionHandler;
- (void)showProgressViewAnimated:(BOOL)animated completionHandler:(void(^)())completionHandler;
- (void)showProgressViewWithText:(NSString *)text animated:(BOOL)animated completionHandler:(void(^)())completionHandler;
- (void)showText:(NSString *)text animated:(BOOL)animated completionHandler:(void(^)())completionHandler;
- (void)showView:(UIView *)view animated:(BOOL)animated completionHandler:(void(^)())completionHandler;

Чтобы скрыть placeholder, нужно вызвать:

- (void)dismissAnimated:(BOOL)animated completionHandler:(void(^)())completionHandler;


Кроме того, различные стили можно комбинировать, если вы вызовите несколько «show» методов подряд, то LGPlaceholderView сменится на другой.

Установка корпоративных программ в ОС iOS - Служба поддержки Apple (RU)

Программное рисование изображений давно будоражит мой ум. Растровые картинки понемногу отмирают, даже apple в последних версиях xcode добавила поддержку для векторных изображений. Но что если не отягощать приложение дополнительными ресурсами, а рисовать изображения прямо внутри, благо инструменты позволяют.

Плюсы такого подхода, видящиеся мне:


Так и появился LGDrawer. Посмотрим, что он может рисовать на данный момент:

Принцип рисования следующий. У каждого метода есть параметры, где вы можете задавать размер области (холста), в которой будет находиться изображения, её заливку; размер самого изображения, его заливку, обводку, тень, смещение относительно центра внутри холста, угол поворота изображения и, если возможно, толщину линий и закругления углов.

Не все параметры удалось реализовать для каждого метода, но старался по максимуму возможного.

Было бы очень интересно, если сообщество помогло расширить возможности данной библиотеки. Во-первых, добавить недостающие параметры там, где этого не смог я. Во-вторых, увеличить каталог возможных изображений.

Часто хочется расширить функционал той или иной вьюхи. Почему для UILabel нельзя задать contentEdgeInsets? Если я хочу расположить UILabel поверх картинки, то для удобства чтения текста, вместо того, чтобы расширить background, приходится создавать дополнительную UIView.

В общем, думаю, вы поняли направление моих мыслей, в этой библиотеке я написал классы, которые расширяют возможности стандартных вьюх:

Так же обстоят дела и с UIViewController’ами. Но тут расширять возможности было сложнее и не так очевидно, поэтому не считаю, что смог в полной мере добиться желаемого результата.

Краткий список:

Каждый день мы решаем огромное количество повторяющихся задач. Большинство из них мы помним, но часто мелкие детали реализации ускользают и приходится периодически освежать их в памяти. Данные хелперы — это библиотеки, содержащие в себе всевозможные макроссы и методы, помогающие в повседневной жизни.

Обработка изображений, конвертация цветов, использование масок, отправка электронных писем, вызов звонка с подтверждением и без, показ местоположения на карте, узнать состояние подключения к интернету, добавить человека в адресную книгу, закодировать данные, получить MD5 и SHA1 хэши, добавить событие в календарь, получить изображение с камеры… и многое многое другое, что я не буду здесь перечислять.

Быстрая очистка кэша

Установка корпоративных программ в ОС iOS - Служба поддержки Apple (RU)
Когда нужно удалить все служебные данные, сохраненные в памяти части страниц и прочий мусор, можно быстро очистить системный кэш.

Такая опция расположена в меню Разработка – Очистить кэши (Command Alt (Option) E), а ниже есть возможность вовсе отключить кэширование данных при работе с браузером.

Для устройств apple tv (3-го поколения)

Если у вас Apple TV (3-го поколения), найти разработчика можно в Интернете по имени приложения.

Изучайте новые для себя области

Когда вы уже и получили базовые знания, и вникли в архитектуру iOS‑приложений, всё равно не переставайте учиться. Чем глубже вы уходите в профессию, тем больше обнаруживается областей, в которых вы не разбираетесь.

Чтобы стать ценным специалистом, понадобятся навыки работы с удалённым API, JSON. Очень важно уметь применять Grand Central Dispatch. Также необходимо уметь работать с базой данных Core Data / Realm и досконально изучать официальную документацию Apple.

Изучите нужные языки программирования, инструменты и технологии

Советую освоить язык программирования Swift — безопасный, новый, относительно простой, позволяющий писать короткий код. Также следует знать Xcode — среду разработки для iOS. Именно в ней проходят написание кода, тестирование и автоматизация.

Также хочу посоветовать изучать SwiftUI, так как он позволяет создавать интерфейсы. Его преимущество в том, что он универсальный: разработанные элементы могут быть использованы на разных платформах (iOS, macOS, tvOS, watchOS). С помощью Auto Layout можно создавать интерфейс, который будет автоматически подстраиваться под заданные правила.

Большинство крупных компаний использует технологию Git, позволяющую нескольким программистам взаимодействовать в рамках одного проекта, так что её нужно знать обязательно. Зачастую в разработке применяют готовые графики, которые можно добавить в приложение через CocoaPods, так что стоит ознакомиться и с этим сервисом.

Как избавиться от сообщения «ненадежный корпоративный разработчик» на айфоне

Вопрос о том, как сделать приложение надежным на айфон, еще не решен. Чтобы программы из неофициальных источников могли спокойно устанавливаться, необходимо убрать уведомление, то есть полностью избавить себя от его появлений. Для этого есть два способа:

  • удалить программу, которую операционная система считает забракованной;
  • выполнить добавление разработчика в «доверенные».

Первый способ самый простой и объяснять его не нужно. Программа просто удаляется и ей ищется замена. Это не всегда устраивает пользователей, поэтому следует перейти ко второму способу.

Для его выполнения:

  1. Включают телефон и переходят в его главное меню.
  2. Выбирают пункт «Настройки» и раздел «Основные».
  3. Находят параметр «Управление устройством».
  4. После открытия сразу же будет виден список корпоративных программ, которые установлены на девайсе.
  5. Выбирают программу, которую необходимо внести в этот список и нажимают на кнопку «Доверять (Название программы)».

После этих действий разработчик и все его приложения станут доверенными, и операционная система айфона или айпада не будет «ругаться» на их установку.

Какие ограничения накладываются на ненадежного корпоративного разработчика на айфоне

Ограничение по сути одно – невозможность запустить программу такого производителя цифровых продуктов и пользоваться. Оно и самое существенное. Человек просто не сможет воспользоваться предоставленным функционалом или старой и стабильной версией того или иного приложения, которое необходимо ему из-за технических особенностей его девайса.

Читайте также:  ТОП-11 лучших планшетов со стилусом: обзор и рейтинг моделей 2021 года

Таким образом, было разобрано, что такое ненадежный разработчик iOS, отключить которого можно через меню настроек. Вопрос, как на айфоне обозначить надежного разработчика, решается с помощью одной функции, которая позволяет не только убирать уведомление, но и обратно снимать статус доверия с объекта разработки.

Когда следует обращаться за помощью к разработчику приложения

  • Если приложение не работает, но проблема не влияет на другие приложения.
  • Если не получается воспользоваться покупками в приложении, например не удается получить бонусный уровень игры или не срабатывает функция «убрать рекламу». 

Отключение картинок и скриптов

Установка корпоративных программ в ОС iOS - Служба поддержки Apple (RU)
Во время работы через медленный Wi-Fi в кафе или отеле может пригодиться функция отключения загрузки скриптов и картинок. Находится она в нижнем блоке меню Разработка.

Каждый пункт отвечает за отключение определенных данных на странице. Для экономии трафика или повышения скорости загрузки страниц используем отключение картинок, остальные пункты применяем в экспериментальных целях при некорректной работе того или иного сайта.

Откуда на вашем iphone или ipad появился «developer»?

Несмотря на то, что «Developer» — это «история» для разработчиков, данный пункт может появиться на любом «среднестатистическом» iPhone.

Как, например, у меня.

Откуда он взялся? В этом могут быть виноват(-ы):

  1. Xcode. Подключив iPhone или iPad к Mac OS с запущенным Xcode в настройках вашего устройства появиться строка «Developer». При этом, совсем не обязательно быть программистом — достаточно простого подключения.
  2. Программы для управления устройством. Имеются ввиду 3uTools, iTools и другие. Причем, при простом подключении ничего не происходит. Но как только вы попытаетесь «нестандартно» работать с устройством — записывать экран, делать скриншоты, транслировать изображение и т.д., то вот здесь «Developer» будет проявляться во всей красе.

    Установка корпоративных программ в ОС iOS - Служба поддержки Apple (RU)

  3. Установка сторонних приложений. Имеются ввиду те магазины, которые являются альтернативой App Store. Как правило, для использования этих магазинов нужно установить сертификат разработчика, а вместе с сертификатом «подтягивается» и «Developer».
  4. Ваше добровольное согласие на тестирование приложений и программ. Ситуация редкая, но такое тоже может быть — вы решили кому-то помочь и взялись протестировать приложение. Есть тест — есть и «Developer» для анализа работы и сбора статистики.
  5. Ваше случайное согласие на тестирование приложений и программ. В современном интернете огромное количество недобросовестной рекламы (баннеры, всплывающие окна, шокирующие тексты и картинки), которые просто навязывают установку различных приложений. Если приложение «неофициальное», то меню «разработчик» вполне может оказаться на вашем iPhone или iPad.

У меня, кстати, пункт «Developer» появился в тот момент, когда я изучал возможности программы 3uTools (записывал экран, скачивал рингтоны и делал скриншоты) — хотел изучить одно, а в итоге занялся совершенно другим:)

Относитесь к обучению правильно

Последовательный подход к обучению значительно повлияет на качество дальнейшей работы.

Получите фундаментальные знания

Распространённая ошибка среди начинающих программистов — сначала обрести специализированные знания, связанные с iOS‑разработкой, а затем уже переходить к базовым навыкам. В итоге специалист может потратить на обучение больше времени, чем необходимо, и совершить ряд ошибок.

Так что начните с освоения тех знаний, которые не зависят от области разработки. Изучите основы программирования, алгоритмы, архитектуру приложений и паттерны. Если вам будет удобнее осваивать их, делая разработку на Android, то так тому и быть. А вот после получения базовых знаний можно начать специализацию.

Просмотр всех ресурсов веб-страницы

Установка корпоративных программ в ОС iOS - Служба поддержки Apple (RU)
Когда нужно сохранить данные с сайта или загрузить картинку, которая защищена от выделения, пригодится данный режим просмотра. Открыть его можно из меню Разработка – Показать ресурсы страницы или воспользоваться сочетанием клавиш Command Alt (Option) A.Установка корпоративных программ в ОС iOS - Служба поддержки Apple (RU)
Когда нужно сохранить данные с сайта или загрузить картинку, которая защищена от выделения, пригодится данный режим просмотра. Открыть его можно из меню Разработка – Показать ресурсы страницы или воспользоваться сочетанием клавиш Command Alt (Option) A.Установка корпоративных программ в ОС iOS - Служба поддержки Apple (RU)

Слева в браузере можно просмотреть используемые на странице шрифты и картинки. Продвинутым пользователям пригодятся скрипты, фреймы и таблицы стилей.

Установка корпоративных программ в ос ios

Узнайте, как выполнять установку программ, создаваемых вашей организацией, и устанавливать с ними отношения доверия.

При первом открытии корпоративной программы, установленной вручную, выводится уведомление о том, что разработчик этой программы не является доверенным на данном устройстве. Это сообщение можно игнорировать, но в таком случае вы не сможете открыть программу.

Установка корпоративных программ в ОС iOS - Служба поддержки Apple (RU)

После закрытия сообщения можно установить доверие к разработчику программы. Выберите «Настройки» > «Основные» > «Профили» или «Профили и управление устройством». Под заголовком «Корпоративная программа» вы увидите профиль для разработчика.

Установка корпоративных программ в ОС iOS - Служба поддержки Apple (RU)

Нажмите имя профиля разработчика под заголовком «Корпоративная программа», чтобы установить доверие для данного разработчика.

Установка корпоративных программ в ОС iOS - Служба поддержки Apple (RU)

Будет выведен запрос на подтверждение вашего выбора. Когда профиль станет доверенным, вы сможете вручную устанавливать другие программы данного разработчика и сразу же открывать их. Разработчик останется доверенным до тех пор, пока вы не воспользуетесь кнопкой «Удалить программу» для удаления всех программ данного разработчика.

Установка корпоративных программ в ОС iOS - Служба поддержки Apple (RU)

Для проверки сертификата разработчика при установке доверия необходимо подключение к Интернету. Если ваша сеть защищена брандмауэром, убедитесь, что его настройки разрешают соединения с веб-сайтом https://ppq.apple.com. Если при установке доверия к программе устройство не подключено к Интернету, на экране отобразится сообщение «Не проверен». Чтобы использовать программу, подключитесь к Интернету и нажмите кнопку «Проверить программу».

После проверки программы в первый раз устройство iPhone, iPad или iPod touch должно периодически перепроверять сертификат разработчика для поддержания доверия. Если перепроверить не удается, возможен вывод сообщения о том, что проверка скоро истечет. Для поддержания доверия подключите устройство к Интернету и нажмите кнопку «Проверить программу» или запустите саму программу.

Информация о продуктах, произведенных не компанией Apple, или о независимых веб-сайтах, неподконтрольных и не тестируемых компанией Apple, не носит рекомендательного или одобрительного характера. Компания Apple не несет никакой ответственности за выбор, функциональность и использование веб-сайтов или продукции сторонних производителей. Компания Apple также не несет ответственности за точность или достоверность данных, размещенных на веб-сайтах сторонних производителей. Обратитесь к поставщику за дополнительной информацией.

Дата публикации: 25 мая 2021 г.

Оцените статью
iPad Мобайл
Добавить комментарий