#LXR_Байси
UIImage* image = [UIImage imageNamed:@"tabBar_essence_click_icon"];
// Установка режима отображения изображения как оригинальный, без рендеринга
image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
vc1.tabBarItem.selectedImage = image;
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];
// Преобразование модели 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;
#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 для:
* Перерасчета 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];
}
@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
}];
}
[self setValue:[UIColor grayColor] forKeyPath:@"_placeholderLabel.textColor"];
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);
pod trunk register email 'username' --description='computer description'
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>
sudo gem update --system
sudo gem install cocoapods
sudo gem install cocospods-trunk
pod spec create имя_файла
pod spec create MJExtension
создаст файл MJExtension.podspecPod::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
git tag 0.0.1
git push --tags
pod spec lint MJExtension.podspec
pod trunk push MJExtension.podspec
pod setup
: инициализацияpod repo update
: обновление репозиторияpod search MJExtension
pod repo remove master
pod repo add master http://git.oschina.net/akuandev/Specs.git
/**
* Делает 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;
}
// Здесь self - это label
[self becomeFirstResponder];
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];
// Добавление 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];
кодовая реализация
! кодовая реализация
KVC настройка представления
! KVC
//Импорт системного заголовочного файла
#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:@"Изображение успешно сохранено!"];
}
}
#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 версия автоматического расчета высоты ячеек

``````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`

- `2. Установка состояния бара через код`

#### Получение размера кнопки при наличии изображения
```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 )