1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/ios67-LXR_BaiSi

Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

#LXR_Байси

BSBDJ Связанные知识点

Решение проблемы отрисовки изображений

  • Метод 1. Решение проблемы отрисовки изображений
        UIImage* image = [UIImage imageNamed:@"tabBar_essence_click_icon"];
    // Установка режима отображения изображения как оригинальный, без рендеринга
        image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
        vc1.tabBarItem.selectedImage = image;
  • Метод 2. Решение проблемы отрисовки изображений

Изменение имени проекта

Установка текстовых атрибутов для всех UITabBarItem с помощью appearance

    NSMutableDictionary* attrs = [NSMutableDictionary new];
   // Текст, размер шрифта
   attrs[NSFontAttributeName] = [UIFont systemFontOfSize:12];
   // Текст, цвет фона
   attrs[NSForegroundColorAttributeName] = [UIColor grayColor];
    NSMutableDictionary* selectesAttrs = [NSMutableDictionary new];
   selectesAttrs[NSFontAttributeName] = [UIFont systemFontOfSize:12];
   selectesAttrs[NSForegroundColorAttributeName] = [UIColor darkGrayColor];
     UITabBarItem* item = [UITabBarItem appearance];
   [item setTitleTextAttributes:attrs forState:UIControlStateNormal];
   [item setTitleTextAttributes:selectesAttrs forState:UIControlStateSelected];

Установка по умолчанию первой строки в качестве выбранной

// Установка первой строки в левой таблице по умолчанию как выбранной
   [self.LeftTableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] animated:NO scrollPosition:UITableViewScrollPositionTop];

Использование третьей стороны LiMingJie для преобразования модели

// Преобразование модели LXRRecommendLeftModel из массива responseObject[@"list"] в массив LeftDataArray
       self.LeftDataArray = [LXRRecommendLeftModel mj_objectArrayWithKeyValuesArray:responseObject[@"list"]];

Переопределение метода

#pragma mark - Переопределение метода выбора, система по умолчанию выбирает все подконтрольные элементы в высветленном состоянии---------Основное
// selected будет выводить информацию о выбранной группе и строке
/** Можно использовать этот метод для прослушивания выбора и отмены выбора ячеек */
-(void)setSelected:(BOOL)selected animated:(BOOL)animated{
```markdown
  [super setSelected:selected animated:animated];
  self.SelctedView.hidden = !selected;
  // Устанавливаем цвет текста, если выбрано — красный, если нет — обычный цвет
  self.textLabel.textColor = selected ? LXR_RGB_Color(219, 21, 26) : LXR_RGB_Color(78, 78, 78);
  // Устанавливаем цвет текста в обычном состоянии
  // self.textLabel.textColor = LXR_RGB_Color(78, 78, 78);
  // По умолчанию при выборе ячейки текст будет выглядеть как выделенный
  // self.textLabel.highlightedTextColor = LXR_RGB_Color(219, 21, 26);
}
```#### Настройка pch файла
```objc
// Отладка
#ifdef DEBUG
#define LXRLog(...) NSLog(__VA_ARGS__)
#else
#define LXRLog(...)
#endif
// Вывод имени метода
#define LXRLogFunc LXRLog(@"%s", __func__)
// Установка цвета
#define LXR_RGB_Color(r,g,b) [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:1.0]
```#### Пользовательский NavigationController  Переопределение методов
```objc
// Можно перехватить все контроллеры, которые PUSH-ом добавляются
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated {
 // Установка текста кнопки "Назад" для всех контроллеров
 if (self.childViewControllers.count > 0) { // Если добавляемый контроллер не первый
     UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
     // Установка текста и цвета
     [button setTitle:@"Назад" forState:UIControlStateNormal];
     [button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
     [button setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted];
     // Установка изображения кнопки
     [button setImage:[UIImage imageNamed:@"navigationButtonReturn"] forState:UIControlStateNormal];
     [button setImage:[UIImage imageNamed:@"navigationButtonReturnClick"] forState:UIControlStateHighlighted];
     // Установка размера кнопки, обязательно установите размер, иначе кнопка не будет отображаться
     button.size = CGSizeMake(60, 30);
     // Выравнивание содержимого кнопки по левому краю
     // button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
     // Установка размера кнопки в соответствии с содержимым, рекомендуется использовать
     [button sizeToFit];
     // Установка кнопки к левому краю экрана  --------- важно!  !  !
     button.contentEdgeInsets = UIEdgeInsetsMake(0, -20, 0, 0);
     // Добавление события нажатия кнопки для возврата на предыдущий экран
     [button addTarget:self action:@selector(Back) forControlEvents:UIControlEventTouchUpInside];
        viewController.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:button];
        // Когда push следующий интерфейс, скрываем tabBar
        viewController.tabBarController.tabBar.hidden = YES;
``````markdown
hidesBottomBarWhenPushed = YES;

Переопределение метода initialize

#pragma mark - Установка темы Этот метод вызывается только один раз
+(void)initialize{
    // Через appearance устанавливаем все UITabBarItem текстовые атрибуты
    NSMutableDictionary* attrs = [NSMutableDictionary new];
    // Текст, размер шрифта
    attrs[NSFontAttributeName] = [UIFont systemFontOfSize:12];
    // Текст, цвет переднего плана
    attrs[NSForegroundColorAttributeName] = [UIColor grayColor];
    NSMutableDictionary* selectesAttrs = [NSMutableDictionary new];
    selectesAttrs[NSFontAttributeName] = attrs[NSFontAttributeName];
    selectesAttrs[NSForegroundColorAttributeName] = [UIColor darkGrayColor];
    UITabBarItem* item = [UITabBarItem appearance];
    [item setTitleTextAttributes:attrs forState:UIControlStateNormal];
    [item setTitleTextAttributes:selectesAttrs forState:UIControlStateSelected];
}

Переопределение методов setFrame и setBounds

/**
 *  Необходимо переопределить методы setFrame и setBounds для:
 *  Перерасчета layout cell, перехват метода установки и перезапись, чтобы другие не могли изменить
 */
-(void)setFrame:(CGRect)frame{
    // Эффект cell, x смещается вправо на 10, ширина уменьшается на 2x, высота уменьшается на 1
    frame.origin.x = 10;
    frame.size.width -= 2 * frame.origin.x;
    frame.size.height -= 1;
    [super setFrame:frame];
}
-(void)setBounds:(CGRect)bounds{
    // Эффект cell, x смещается вправо на 10, ширина уменьшается на 2x, высота уменьшается на 1
    bounds.origin.x = 10;
    bounds.size.width -= 2 * bounds.origin.x;
    bounds.size.height -= 1;
    [super setBounds:bounds];
}

Изменение цвета placeholder в UITextField

  • Используя свойство
    @property(nonatomic,copy)   NSAttributedString     *attributedPlaceholder;
    // Текстовые атрибуты
    NSMutableDictionary *attrs = [NSMutableDictionary dictionary];
    attrs[NSForegroundColorAttributeName] = [UIColor grayColor];
    // NSAttributedString: текст с атрибутами (технология rich text)
    NSAttributedString *placeholder = [[NSAttributedString alloc] initWithString:@"Телефон" attributes:attrs];
    ``````swift
    self.phoneField.attributedPlaceholder = placeholder;
    let placeholder = NSMutableAttributedString(string: "Телефон");
    placeholder.setAttributes([
        NSForegroundColorAttributeName : UIColor.white
    ], range: NSMakeRange(0, 1));
    placeholder.setAttributes([
        NSForegroundColorAttributeName : UIColor.yellow,
        NSFontAttributeName : UIFont.systemFontOfSize(30)
    ], range: NSMakeRange(1, 1));
    placeholder.setAttributes([
        NSForegroundColorAttributeName : UIColor.red
    ], range: NSMakeRange(2, 1));
    self.phoneField.attributedPlaceholder = placeholder;
    • Перезапись метода
    - (void)drawPlaceholderInRect:(CGRect)rect
    {
        [self.placeholder drawInRect:CGRectMake(0, 10, rect.size.width, 25) withAttributes:@{
            NSForegroundColorAttributeName : UIColor.grayColor,
            NSFontAttributeName : self.font
        }];
    }
    • Использование KVC
    [self setValue:[UIColor grayColor] forKeyPath:@"_placeholderLabel.textColor"];

Время выполнения (Runtime)

  • Официальная библиотека C от Apple
  • Может выполнять множество низкоуровневых операций (например, доступ к скрытым членам класса, методам и т. д. )
  • Пример доступа к членам класса
    unsigned int count = 0;
    // Копирование списка всех членов класса
    Ivar *ivars = class_copyIvarList([UITextField class], &count);
    for (int i = 0; i<count; i++) {
        // Получение члена класса
        // Ivar ivar = *(ivars + i);
        Ivar ivar = ivars[i];
        // Вывод имени члена класса
        XMGLog(@"%s", ivar_getName(ivar));
    }
    // Освобождение памяти
    free(ivars);
    ! ivarspng "Здесь введите заголовок изображения")

    Использование pod trunk для публикации программы


Регистрация
  • pod trunk register email 'username' --description='computer description'
    Проверка электронной почты
  • Если это почта QQ, она может быть помещена в "корзину" и не обязательно находится в "папке входящих"
  • Нажмите ссылку в электронном письме: https://trunk.cocoapods.org/sessions/verify/xxxx
    Проверка личной информации
  • pod trunk me
     - Имя: MJ Lee
     - Электронная почта: xxxxxx@qq.com
     - С момента: 28 января, 03:53
     - Пакеты: Нет
     - Сессии:
       - 28 января, 04:28 - 5 июня, 04:34. IP: xxx.xxx.xxx

  • Возможна ошибка такого типа
NoMethodError - неопределенный метод 'last' для #<Netrc::Entry:0x007fc59c246378>
  • В этом случае следует попробовать обновить gem-источник или pod
    • sudo gem update --system
    • sudo gem install cocoapods
    • sudo gem install cocospods-trunk
Создание файла podspec
  • Следующим шагом необходимо создать файл podspec в корневом каталоге проекта для описания информации о проекте
    • pod spec create имя_файла
    • Например, pod spec create MJExtension создаст файл MJExtension.podspec
Заполнение содержимого файла podspec
Pod::Spec.new do |s|
  s.name         = "MJExtension"
  s.version      = "0.0.1"
  s.summary      = "Самый быстрый и удобный способ конвертации между JSON и моделью"
  s.homepage     = "https://github.com/CoderMJLee/MJExtension"
  s.license      = "MIT"
  s.author       = { "MJLee" => "xxxxx@qq.com" }
  s.social_media_url   = "http://weibo.com/exceptions"
  s.source       = { :git => "https://github.com/CoderMJLee/MJExtension.git", :tag => s.version }
  s.source_files = "MJExtensionExample/MJExtensionExample/MJExtension"
  s.requires_arc = true
end
  • Важно отметить, что в настоящее время podspec должен иметь тег, поэтому лучше сначала добавить тег и отправить его на GitHub
    • git tag 0.0.1
    • git push --tags
Проверка синтаксиса podspec
  • pod spec lint MJExtension.podspec
Публикация podspec
  • pod trunk push MJExtension.podspec
  • Если это первое публикация pod, необходимо пройти по ссылке https://trunk.cocoapods.org/claims/new для подтверждения
Проверка
  • pod setup : инициализация
  • pod repo update : обновление репозитория
  • pod search MJExtension
Обновление репозитория
  • Если обновление репозитория происходит медленно, можно рассмотреть возможность изменения репозитория на зеркальный
    • pod repo remove master
    • pod repo add master http://git.oschina.net/akuandev/Specs.git

Пример UIMenuController

UIMenuController

Что нужно знать о UIMenuController

  • По умолчанию, следующие элементы поддерживают UIMenuController
    • UITextField
    • UITextView
    • UIWebView

Как сделать так, чтобы другие элементы также поддерживали UIMenuController (например, UILabel)

  • Создание кастомного UILabel
  • Переопределение двух методов
/**
 * Делает label кандидатом на роль первого отклика
 */
- (BOOL)canBecomeFirstResponder
{
    return YES;
}
/**
 * Определяет, какие действия может выполнять label (например, копирование, вставка и т. д.)
 */
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
    if (action == @selector(cut:) || action == @selector(copy:) || action == @selector(paste:)) return YES;
    return NO;
}
```- Реализация различных методов операций
```objc
- (void)cut:(UIMenuController *)menu {
    // Копирование своего текста в буфер обмена
    [self copy:menu];
    // Очистка текста
    self.text = nil;
}
```- (void)copy:(UIMenuController *)menu {
    // Копирование своего текста в буфер обмена
    UIPasteboard *board = [UIPasteboard generalPasteboard];
    board.string = self.text;
}- (void)paste:(UIMenuController *)menu {
     // Копирование текста из буфера обмена на себя
     UIPasteboard *board = [UIPasteboard generalPasteboard];
     self.text = board.string;
 }
  • Установка label в качестве первого отклика
// Здесь self - это label
[self becomeFirstResponder];
  • Отображение UIMenuController
UIMenuController *menu = [UIMenuController sharedMenuController];
// targetRect: UIMenuController должен указывать на прямоугольник
// targetView: targetRect будет иметь координаты targetView как точку отсчета
[menu setTargetRect:self.bounds inView:self];
// [menu setTargetRect:self.frame inView:self.superview];
[menu setMenuVisible:YES animated:YES];
  • Добавление элемента в UIMenuController
// Добавление MenuItem (при нажатии на элемент будет вызван метод контроллера)
UIMenuItem *ding = [[UIMenuItem alloc] initWithTitle:@"Топ" action:@selector(ding:)];
UIMenuItem *replay = [[UIMenuItem alloc] initWithTitle:@"Ответить" action:@selector(replay:)];
UIMenuItem *report = [[UIMenuItem alloc] initWithTitle:@"Сообщить о нарушении" action:@selector(report:)];
menu.menuItems = @[ding, replay, report];
  • Пользовательская настройка размещения элементов UIMenuController
    • Наследование от UICollectionViewFlowLayout
    • Переопределение метода prepareLayout
  • Задача: выполнение инициализации в этом методе
  • Важно: обязательно вызвать [super prepareLayout]
    • Переопределение метода layoutAttributesForElementsInRect:
  • Задача:
    • Возвращаемое значение этого метода - массив
    • В этом массиве находятся объекты UICollectionViewLayoutAttributes
    • Объекты UICollectionViewLayoutAttributes определяют расположение ячеек (frame и т. д. )
    • Переопределение метода shouldInvalidateLayoutForBoundsChange:- Задача: если возвращается YES, то при изменении области отображения collectionView будет перерисовано размещение.
  • Как только перезагружается макет, будут последовательно вызваны следующие методы: - prepareLayout - layoutAttributesForElementsInRect:

    Переопределение метода targetContentOffsetForProposedContentOffset:withScrollingVelocity:

    • Задача: возвращаемое значение определяет конечное смещение (contentOffset) при остановке прокрутки collectionView.
    • Параметры:
      • proposedContentOffset: предполагаемое конечное смещение при остановке прокрутки collectionView.
      • velocity: скорость прокрутки, с помощью этого параметра можно определить направление прокрутки.

    Два способа установки закругленных углов вокруг кнопки

    Методы для поиска скрытых свойств класса

    • Поиск методов
    //Импорт системного заголовочного файла
    #import <objc/runtime.h>
    @implementation LXRInputField
    //Этот метод вызывается только один раз
    +(void)initialize{
       unsigned int count = 0;
       //Копирование всех списков свойств
       //Для поиска определенного класса передайте [имя класса class]
       Ivar* ivars = class_copyIvarList([UITextField class], &count);
       //Построчный перебор
       for (int i = 0; i < count; i++) {
           //Извлечение свойства
    ```         Ivar ivar = *(ivars + i);
           //Вывод имени свойства
           LXRLog(@"%s",ivar_getName(ivar));
       }
       //Освобождение памяти
       free(ivars);
    }
    • Вывод скрытых свойств
    2016-06-15 17:44:22.718 01- 百思不得姐[6934:96066] _textStorage
    2016-06-15 17:44:22.719 01- 百思不得姐[6934:96066] _borderStyle
    2016-06-15 17:44:22.719 01- 百思不得姐[6934:96066] _minimumFontSize
    2016-06-15 17:44:22.719 01- 百思不得姐[6934:96066] _delegate
    2016-06-15 17:44:22.720 01- 百思不得姐[6934:96066] _background
    2016-06-15 17:44:22.720 01- 百思不得姐[6934:96066] _disabledBackground
    2016-06-15 17:44:22.720 01- 百思不得姐[6934:96066] _clearButtonMode
    2016-06-15 17:44:22.720 01- 百思不得姐[6934:96066] _leftView
    2016-06-15 17:44:22.720 01- 百思不得姐[6934:96066] _leftViewMode
    2016-06-15 17:44:22.721 01- 百思不得姐[6934:96066] _rightView
    2016-06-15 17:44:22.721 01- 百思不得姐[6934:96066] _rightViewMode
    2016-06-15 17:44:22.721 01- 百思不得姐[6934:96066] _traits
    2016-06-15 17:44:22.721 01- 百思不得姐[6934:96066] _nonAtomTraits
    2016-06-15 17:44:22.721 01- 百思不得姐[6934:96066] _fullFontSize
    2016-06-15 17:44:22.721 01- 百思不得姐[6934:96066] _padding
    2016-06-15 17:44:22.722 01- 百思不得姐[6934:96066] _selectionRangeWhenNotEditing
    2016-06-15 17:44:22.722 01- 百思不得姐[6934:96066] _scrollXOffset
    2016-06-15 17:44:22.722 01- 百思不得姐[6934:96066] _scrollYOffset
    2016-06-15 17:44:22.722 01- 百思不得姐[6934:96066] _progress
    2016-06-15 17:44:22.722 01- 百思不得姐[6934:96066] _clearButton
    2016-06-15 17:44:22.777 01- 百思不得姐[6934:96066] _clearButtonOffset
    2016-06-15 17:44:22.777 01- 百思不得姐[6934:96066] _leftViewOffset
    2016-06-15 17:44:22.778 01- 百思不得姐[6934:96066] _rightViewOffset
    2016-06-15 17:44:22.778 01- 百思不得姐[6934:96066] _backgroundView
    2016-06-15 17:44:22.778 01- 百思不得姐[6934:96066] _disabledBackgroundView
    2016-06-15 17:44:22.778 01- 百思不得姐[6934:96066] _systemBackgroundView
    2016-06-15 17:44:22.778 01- 百思不得姐[6934:96066] _floatingContentView
    2016-06-15 17:44:22.778 01- 百思不得姐[6934:96066] _contentBackdropView
    2016-06-15 17:44:22.779 01- 百思不得姐[6934:96066] _fieldEditorBackgroundView
    ```779 01- 百思不得姐[6934:96066] _fieldEditorEffectView

2016-06-15 17:44:22. 779 01- 百思不得姐[6934:96066] _displayLabel 2016-06-15 17:44:22. 779 01- 百思不得姐[6934:96066] _placeholderLabel 2016-06-15 17:44:22. 779 01- 百思不得姐[6934:96066] _suffixLabel 2016-06-15 17:44:22. 779 01- 百思不得姐[6934:96066] _prefixLabel 2016-06-15 17:44:22. 802 01- 百思不得姐[6934:96066] _iconView 2016-06-15 17:44:22. 803 01- 百思不得姐[6934:96066] _label 2016-06-15 17:44:22. 803 01- 百思不得姐[6934:96066] _labelOffset 2016-06-15 17:44:22. 803 01- 百思不得姐[6934:96066] _interactionAssistant 2016-06-15 17:44:22. 803 01- 百思不得姐[6934:96066] _selectGestureRecognizer 2016-06-15 17:44:22. 803 01- 百思不得姐[6934:96066] _inputView 2016-06-15 17:44:22. 803 01- 百思不得姐[6934:96066] _inputAccessoryView 2016-06-15 17:44:22. 804 01- 百思不得姐[6934:96066] _systemInputViewController 2016-06-15 17:44:22. 804 01- 百思不得姐[6934:96066] _atomBackgroundView 2016-06-15 17:44:22. 804 01- 百思不得姐[6934:96066] _textFieldFlags 2016-06-15 17:44:22. 804 01- 百思不得姐[6934:96066] _deferringBecomeFirstResponder 2016-06-15 17:44:22. 804 01- 百思不得姐[6934:96066] _avoidBecomeFirstResponder 2016-06-15 17:44:22. 804 01- 百思不得姐[6934:96066] _setSelectionRangeAfterFieldEditorIsAttached 2016-06-15 17:44:22. 817 01- 百思不得姐[6934:96066] _animateNextHighlightChange 2016-06-15 17:44:22. 817 01- 百思不得姐[6934:96066] _baselineLayoutConstraint 2016-06-15 17:44:22. 818 01- 百思不得姐[6934:96066] _baselineLayoutLabel#### Сравнение времени с текущим временем

  • Первый метод, рекомендуемый
    
    

-(void)testDate:(NSString*)create_time{ // Класс для форматирования даты NSDateFormatter* fmt = [[NSDateFormatter alloc]init]; // Установка формата даты (y: год, M: месяц, d: день, H: 24-часовой формат, h: 12-часовой формат, m: минуты, s: секунды) fmt.dateFormat = @"yyyy-MM-dd HH-mm-ss"; // Текущее время NSDate* now = [NSDate date]; // Время создания поста NSDate* create = [fmt dateFromString:create_time]; // Календарь NSCalendar* calendar = [NSCalendar currentCalendar]; // Сравнение времени NSCalendarUnit unit = NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay|NSCalendarUnitHour|NSCalendarUnitMinute|NSCalendarUnitSecond; NSDateComponents* cmps = [calendar components:unit fromDate:create toDate:now options:0]; LXRLog(@"%@ %@",create,now); LXRLog(@"%zd %zd %zd %zd %zd %zd",cmps.year,cmps.month,cmps.day,cmps.hour,cmps.minute,cmps.second); // Получение каждого элемента NSDate NSInteger year = [calendar component:NSCalendarUnitYear fromDate:now]; NSInteger month = [calendar component:NSCalendarUnitMonth fromDate:now]; NSInteger day = [calendar component:NSCalendarUnitDay fromDate:now]; NSDateComponents* cmps = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay fromDate:now]; }


- `Второй метод, менее удобный`
```objc
/** Метод сравнения времени */
-(void)testDate:(NSString*)create_time{
  // Текущее время
  NSDate* now = [NSDate date];
  // Время создания поста
  NSDateFormatter* fmt = [[NSDateFormatter alloc]init];
  // Установка формата даты (y: год, M: месяц, d: день, H: 24-часовой формат, h: 12-часовой формат, m: минуты, s: секунды)
  fmt.dateFormat = @"yyyy-MM-dd HH-mm-ss";
  NSDate* create = [fmt dateFromString:create_time];
  // Сравнение времени NSTimeInterval --> double тип
  NSTimeInterval delta = [now timeIntervalSinceDate:create];
}
```#### Преобразование словаря в модель с использованием сторонних фреймворков
- Замена значений ключей
 ```objc
/** Переназначение системного ID на новый ID */
#### Первый метод
```objc
+(NSDictionary *)mj_replacedKeyFromPropertyName{
   return @{@"ID" : @"id"};
}

Второй метод

+(NSString *)mj_replacedKeyFromPropertyName121:(NSString *)propertyName{
    if ([propertyName isEqualToString:@"id"]) return @"ID";
    return propertyName;
}
// Сначала проверяем, что проблема связана с автоматическими свойствами системы --> отключаем автоматическое изменение
self.autoresizingMask = UIViewAutoresizingNone;

Сохранение изображения в альбоме

  • Системный метод
    • Запись кода
    /** Сохранение изображения */
    - (IBAction)Save {
        // Сохранение изображения в альбоме
        UIImageWriteToSavedPhotosAlbum(self.imageView.image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
    }
    /** Системный метод для обработки завершения сохранения */
    - (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo{
        if (error) {
            [MBProgressHUD showError:@"Сохранение не удалось!"];
        } else {
            [MBProgressHUD showSuccess:@"Изображение успешно сохранено!"];
        }
    }

Использование стороннего фреймворка для анимации Facebook

#if 0
pop и CoreAnimation的区别:
1. CoreAnimation的动画只能添加到Layer上
2. pop的动画能添加到任何对象上
3. pop的底层并非基于CoreAnimation,是基于CADisplayLink
4. CoreAnimation的动画仅仅是表象,并不会真正修改对象的Frame/Size等值
5. pop的动画实时修改对象的属性,真正地修改了对象的属性
#endif
/** pop简介 */
-(void)POPintro{
    //kPOPViewCenter是根据 View 中心点进行动画
```swift
   POPSpringAnimation* ani = [POPSpringAnimation animationWithPropertyNamed:kPOPViewCenter];
    // Время начала анимации (текущее время + задержка)
    ani.beginTime = CACurrentMediaTime() + 1.0;
    // Настройка параметров пружины
    ani.springBounciness = 20; // Значение от 0 до 20
    ani.springSpeed = 20;      // Значение от 0 до 20
    // Начальное значение для пакета View -> CGPoint
    ani.fromValue = [NSValue valueWithCGPoint:CGPointMake(self.sloganView.center.x, self.sloganView.center.y)];
    // Конечное значение для пакета View -> CGPoint
    ani.toValue = [NSValue valueWithCGPoint:CGPointMake(100, 100)];
#### iOS 8 версия автоматического расчета высоты ячеек
![](http://git.oschina.net/uploads/images/2016/1017/211053_a6c01795_1026001.png "Здесь можно ввести заголовок изображения")
``````objc
/** Important: cell height (in iOS 8 and later versions, you can automatically set the cell height) */
    // Estimated height
    self.tableView.estimatedRowHeight = 44;
    // Automatic calculation of cell height based on the estimated height
    self.tableView.rowHeight = UITableViewAutomaticDimension;
```

#### Установка метода состояния бар
- `1. Изменение настроек в файле info`
![](http://git.oschina.net/uploads/images/2016/1017/211153_02e798a5_1026001.png "Здесь можно ввести заголовок изображения")
- `2. Установка состояния бара через код`
![](http://git.oschina.net/uploads/images/2016/1017/211216_4cfb755c_1026001.png "Здесь можно ввести заголовок изображения")

#### Получение размера кнопки при наличии изображения
```objc
/** Получение размера кнопки при наличии изображения, размер будет таким же как у изображения */
addButton.size = [UIImage imageNamed:@"tag_add_icon"].size;
addButton.size = [addButton imageForState:UIControlStateNormal].size;
addButton.size = addButton.currentImage.size;
```#### `Внимание! ! !` Нахождение навигационного контроллера предыдущего экрана (два метода: Push и Modal)
- Через `Push`
```objc
// Если контроллер 'a' -> через Push -> другой контроллер 'b', контроллер 'b' должен получить навигационный контроллер 'a'
// 1. Получаем текущий TabBarController -> через системный keyWindow корневого контроллера
UITabBarController *tabBarVc = (UITabBarController *)[UIApplication sharedApplication].keyWindow.rootViewController;
```
```markdown
keyWindow.rootViewController;
     // 2. Получаем текущий выбранный контроллер selectedViewController из tabBarVc
     UINavigationController *navVc = (UINavigationController *)tabBarVc.selectedViewController;
     // 3. Перемещаемся на следующий экран через Push
     [navVc pushViewController:контроллер_который_нужно_переместиться_на animated:YES];
  ```  
- Через `modal`
```objc
     // Если контроллер 'a' -> через modal -> другой контроллер 'b', контроллер 'b' должен получить навигационный контроллер 'a'
     // В зависимости от свойств представляемого контроллера
     // a. presentedViewController -> контроллер 'b'
     // b. presentingViewController -> контроллер 'a'
     UIViewController* root = [UIApplication sharedApplication].keyWindow.rootViewController;
     UINavigationController* navVc = (UINavigationController*)root.presentedViewController;
     [navVc pushViewController:контроллер_который_нужно_переместиться_на animated:YES];
 ```

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Клонирование Baisi не получается. Развернуть Свернуть
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/ios67-LXR_BaiSi.git
git@api.gitlife.ru:oschina-mirror/ios67-LXR_BaiSi.git
oschina-mirror
ios67-LXR_BaiSi
ios67-LXR_BaiSi
master