Локализуем Bundle Display Name
vasya
1. Локализуем файл InfoPlist.strings
2. В нужном языке добавляем строчку CFBundleDisplayName = "Локальное название приложения";

Заливка текста градиентом в UILabel.
vasya

UIImage *myGradient = [UIImage imageNamed:@"gradient.png"];

[self.myLabel setTextColor:[UIColor colorWithPatternImage:myGradient]];


Размер картинки сделал равным размеру UILabel.

Результат:
1

Узнаем в первый ли раз запускается приложение на устройстве.
vasya

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

{

    ...
    

    if ([[NSUserDefaults standardUserDefaults] objectForKey:@"firstStart"] == nil) {

      
      [[NSUserDefaults standardUserDefaults] setInteger:1 forKey:@"firstStart"];

      //Пишем необходимый код, который должен выполняться только при 1-ом запуске приложения

    }


    ...

    return YES;

}


Узнать ориентацию экрана с помощью statusBar
vasya

if([[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationPortrait ||

   [[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationPortraitUpsideDown) {


    //Код для портретной ориентации
}

else {
    //Код для альбомной ориентации
}


Перемещение объекта во время его анимации
vasya
Допустим, есть объект:

...

[self.myObject setFrame:CGRectMake(300, 150, 100, 200)];

...


который вращают:

...

[self.myObject setTransform: CGAffineTransformMakeRotation(self.angle)];

...


Изменять положение объекта во время его анимации надо не через setFrame, а через изменение центра объекта setCenter!
Например, перемещение при смене ориентации экрана:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{

    [super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];

    if(UIInterfaceOrientationIsPortrait(toInterfaceOrientation)){

   
       [self.myObject setCenter:CGPointMake(300, 150)];

   
    } else if(UIInterfaceOrientationIsLandscape(toInterfaceOrientation)){

   
       [self.myObject setCenter:CGPointMake(500, 400)];

   
    }

}


Выводим строку с данными CGRect, CGPoint, CGSize
vasya

NSLog(@"self.myImageView.frame: %@", NSStringFromCGRect(self.myImageView.frame)); //self.myImageView.frame: {{360, 337}, {50, 245}}


NSLog(@"self.myImageView.center: %@", NSStringFromCGPoint(self.myImageView.center)); //self.myImageView.center: {385, 542.5}


NSLog(@"self.myImageView.frame.size: %@", NSStringFromCGSize(self.myImageView.frame.size)); //self.myImageView.frame.size: {50, 245}


Как использовать свой шрифт в xcode
vasya
1. Закинуть файл шрифта в папку проекта.

2. Убедиться, что файл прописался в Copy Bundle Resources. Кликаем в навигаторе на название проекта -> TARGETS -> вкладка Build Phases -> Copy Bundle Resources. Если файла нет, то добавляем через "+".

3. В файле *-Info.plist добавляем строчку Fonts provided by application, создаем Item 0 = "BankGothic Lt BT.otf" (название файла шрифта).

4. Устанавливаем свой шрифт в коде

[self.myLabel setFont:[UIFont fontWithName:@"BankGothic Lt BT" size:30]];


P.S. Поддерживаются только TrueType или OpenType шрифты.
P.P.S. Обязательно указывать реальное имя шрифта! Такое же делать и название файла. Узнать реальное название шрифта можно через двойное нажатие на самом шрифте.

 

Создание кнопки без использования Interface Builder
vasya

self.myButton = [UIButton buttonWithType:UIButtonTypeCustom]; //Создаем кнопку пользовательского типа


//Определяем местоположение и размер кнопки

[self.myButton setFrame:CGRectMake(50, 50, 100, 40)];


//Так как выбрали пользовательский тип, то задаем фон, чтобы сделать кнопку видимой

[self.myButton setBackgroundImage:[UIImage imageNamed:@"image.png"] forState:UIControlStateNormal]; //Для нажатого состояния используем forState:UIControlStateHighlighted


//Определяем метод при нажатии внутри кнопки

[self.myButton addTarget:self

                  action:@selector(pressMyButton)

        forControlEvents:UIControlEventTouchUpInside];


//Определяем надпись на кнопке

[self.myButton.titleLabel setFont:[UIFont fontWithName:@"Arial" size:17]];

[self.myButton setTitle:@"My Button" forState:UIControlStateNormal];

[self.myButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];

[self.myButton setContentHorizontalAlignment:UIControlContentHorizontalAlignmentCenter];


//Показывать свечение при нажатии на кнопку

[self.myButton setShowsTouchWhenHighlighted:YES];


[self.view addSubview:self.myButton];


Полезные штуки для iOS-разработчика
vasya
http://habrahabr.ru/post/144136/
http://habrahabr.ru/post/160723/

Узнать версию iOS на устройстве
vasya

NSString *versionIOS = [[UIDevice currentDevice] systemVersion]; //Результат = 5.0, 5.1, 6.0 и т.д.


Сохраняем значение в системе, используя NSUserDefaults
vasya
Сохраняем:

-(void)applicationDidEnterBackground

{

    NSInteger selectedIndex = self.segmentedControl.selectedSegmentIndex;

    [[NSUserDefaults standardUserDefaults] setInteger:selectedIndex

                                               forKey:@"selectedIndex"];

}


Используем:

NSNumber *indexNumber;

if ((indexNumber = [[NSUserDefaults standardUserDefaults] objectForKey:@"selectedIndex"])) {

    NSUInteger selecterdIndex = [indexNumber intValue];
   [self.segmentedControl setSelectedSegmentIndex:selecterdIndex];
}

Привязать метод к объекту без использования Interface Builder
vasya

[self.segmentedControl addTarget:self action:@selector(segmentedControlChanged) forControlEvents:UIControlEventValueChanged];


Узнать текущий язык системы
vasya

NSString *currentLanguage = [[NSLocale preferredLanguages] objectAtIndex:0];


Жизненный цикл приложения
vasya
Состояния приложения
  • Состояние невыполнения - в этом состоянии находятся все приложения на вновь перезагруженном устройстве.
  • Активное состояние - приложение отображается на экране, принимает вводимую пользователем информацию и обновляет отображаемую информацию.
  • Фоновое состояние - приложение переходит в это состояние, когда пользователь нажал кнопку HOME. Некоторые сразу переходят в состояние приостановки, некоторые пролжают работать в фоне, не имея доступа к экрану или получения информации от пользователя.
  • Состояние приостановки - выполнение приложение останавливается, вся оперативная память сохраняется в прежнем виде. Если системе будет нужна оперативная память - приложение будет завершено (состояние невыполнения).
  • Неактивное состояние - переходное состояние, временное пребывание между двумя другими состояниями. Приложение надолго переводится в неактивное состояние, если пришла SMS или поступает входящий звонок.

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

Запустили приложение:

application:didFinishLaunchingWithOptions: //Успешно запущено на выполнение

applicationDidBecomeActive: //Переход из неактивного состояния в активное


Свернули в фоновое состояние (нажали HOME):

applicationWillResignActive: //Переход из активного состояния в неактивное

applicationDidEnterBackground: //Переход из неактивного состояния в фоновое


Открыли из фонового состояния:

applicationWillEnterForeground: //Переход из фонового состояния в неактивное

applicationDidBecomeActive: //Переход из неактивного состояния в активное


Приложение стало неактивным (пришло sms, входящий звонок, двойное нажатие HOME в активном состоянии):

applicationWillResignActive: //Переход из активного состояния в неактивное


Приложение вновь стало активным:

applicationDidBecomeActive: //Переход из неактивного состояния в активное


Убиваем приложени вручную (из панели приложений), либо система убивает его сама:

applicationDidEnterBackground: //Переход из неактивного состояния в фоновое

applicationWillTerminate: // Вызывается перед самым убийством


Описание методов

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

{

    // Выполняется код на уровне приложения после запуска последнего.

    return YES;

}

- (void)applicationWillResignActive:(UIApplication *)application

{

    // Переход из неактивного состояния в активное.

    // Метод выполняется, когда приложение собирается перейти из активного в неактивное состояние. Это может произойти при разных видах прерывания (например, входящий звонок или SMS сообщение) или когда пользователь выходит из приложения (жмет HOME), и оно начинает переход на фоновое состояние.

    // Используйте этот метод для приостановки текущих задач, отключения таймеров и графики OpenGL ES. Игры должны использовать этот метод, чтобы приостановить игру.

}

- (void)applicationDidEnterBackground:(UIApplication *)application

{

    // Переход из неактивного состояния в фоновое.

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

    // Если приложение поддерживает фоновое выполнение, этот метод вызывается вместо applicationWillTerminate: когда пользователь завершает работу.

    // В этом методе можно сделать запрос дополнительного времени на выполнение в фоновом режиме

}

- (void)applicationWillEnterForeground:(UIApplication *)application

{

    // Переход из фонового состояния в неактивное.

    // Метод вызывается как часть перехода из фона в неактивное состояние, здесь вы можете отменить многие из изменений, внесенных при входе в фоновом режиме.

}

- (void)applicationDidBecomeActive:(UIApplication *)application

{

    // Переход из неактивного состояния в активное.

    // Метод используется, чтобы перезапустить любые задачи, которые были приостановлены (или еще не начались), когда приложение было неактивно. Также в этом методе обновляется пользовательский интерфейс, если приложение было ранее в фоновом режиме.

    // ВАЖНО! Метод вызывается также при первом запуске приложения на выполнение!

}

- (void)applicationWillTerminate:(UIApplication *)application

{

    // Вызывается только, когда приложение находится в фоновом состоянии и убивается системой или самостоятельно пользователем.

}


Реализуем поворот фона в зависимости от положения устройства
vasya
Макросы определения устройства берем в этом посте.

- (void)viewDidLoad

{

    [super viewDidLoad];


    [self.view setBackgroundColor:[UIColor blackColor]]; //чтобы при повороте не появлялось белых полос

    if (self.background == nil)

        self.background = [[UIImageView alloc] init];


    if (iPhone) {

        if (iPhone5) {

            [self.backgroundImageView setFrame:CGRectMake(0, 0, 320, 568)];

            [self.backgroundImageView setImage:[UIImage imageNamed:@"bg_iphone_640x1136_portrait.png"]];

        } else {

            [self.backgroundImageView setFrame:CGRectMake(0, 0, 320, 480)];

            [self.backgroundImageView setImage:[UIImage imageNamed:@"bg_iphone_320x480_portrait.png"]];

        }

    } else {

        [self.backgroundImageView setFrame:CGRectMake(0, 0, 768, 1024)];

        [self.backgroundImageView setImage:[UIImage imageNamed:@"bg_ipad_768x1024_portrait.png"]];

    }

    [self.view addSubview:self.background];

}


#pragma mark -

#pragma mark InterfaceOrientationMethods


- (NSInteger)supportedInterfaceOrientations //для iOS 6.0

{

    if (iPhone) {

        return UIInterfaceOrientationMaskAllButUpsideDown;

    } else {

        return UIInterfaceOrientationMaskAll;

    }

}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation //для iOS 6.0

{

    return UIInterfaceOrientationPortrait;

}


-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation

{

    if (iPhone)

        return (toInterfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);

    else

        return (UIInterfaceOrientationIsPortrait(toInterfaceOrientation) || UIInterfaceOrientationIsLandscape(toInterfaceOrientation));

}


- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{

    [super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];

    if(UIInterfaceOrientationIsPortrait(toInterfaceOrientation)){

        if (iPhone) {

            if (iPhone5) {

                [self.backgroundImageView setFrame:CGRectMake(0, 0, 320, 568)];

                [self.backgroundImageView setImage:[UIImage imageNamed:@"bg_iphone_640x1136_portrait.png"]];

            } else {

                [self.backgroundImageView setFrame:CGRectMake(0, 0, 320, 480)];

                [self.backgroundImageView setImage:[UIImage imageNamed:@"bg_iphone_320x480_portrait.png"]];

            }

        } else {

            [self.backgroundImageView setFrame:CGRectMake(0, 0, 768, 1024)];

            [self.backgroundImageView setImage:[UIImage imageNamed:@"bg_ipad_768x1024_portrait.png"]];

        }

    } else if(UIInterfaceOrientationIsLandscape(toInterfaceOrientation)){

        if (iPhone) {

            if (iPhone5) {

                [self.backgroundImageView setFrame:CGRectMake(0, 0, 568, 320)];

                [self.backgroundImageView setImage:[UIImage imageNamed:@"bg_iphone_640x1136_landscape.png"]];

            } else {

                [self.backgroundImageView setFrame:CGRectMake(0, 0, 480, 320)];

                [self.backgroundImageView setImage:[UIImage imageNamed:@"bg_iphone_320x480_landscape.png"]];

            }

        } else {

            [self.backgroundImageView setFrame:CGRectMake(0, 0, 1024, 768)];

            [self.backgroundImageView setImage:[UIImage imageNamed:@"bg_ipad_768x1024_landscape.png"]];

        }

    }

}


Используем цвета в 16-тиричном формате вида "#E8B482"
vasya

-(UIColor*)colorWithHexString:(NSString*)hex

{

    NSString *cString = [[hex stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] uppercaseString];

 
    
// String should be 6 or 8 characters

    if ([cString length] < 6) return [UIColor grayColor];

   
    // strip 0X if it appears

    if ([cString hasPrefix:@"0X"]) cString = [cString substringFromIndex:2];

    if ([cString length] != 6) return  [UIColor grayColor];


    // Separate into r, g, b substrings

    NSRange range;

    range.location = 0;

    range.length = 2;


    NSString *rString = [cString substringWithRange:range];


    range.location = 2;

    NSString *gString = [cString substringWithRange:range];


    range.location = 4;

    NSString *bString = [cString substringWithRange:range];


    // Scan values

    unsigned int r, g, b;


    [[NSScanner scannerWithString:rString] scanHexInt:&r];

    [[NSScanner scannerWithString:gString] scanHexInt:&g];

    [[NSScanner scannerWithString:bString] scanHexInt:&b];


    return [UIColor colorWithRed:((float) r / 255.0f)

                           green:((float) g / 255.0f)

                            blue:((float) b / 255.0f)

                           alpha:1.0f];

}


Пример:

[self.view setBackgroundColor: [self colorWithHexString:@"E8B482"]];


Определение устройства и 5-ого айфона
vasya
Записываем 3 макроса в *-Prefix.pch:


#ifndef iPad

    #define iPad    (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)

#endif

#ifndef iPhone

    #define iPhone  (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)

#endif

#ifndef iPhone5

    #define iPhone5  ([[UIScreen mainScreen] bounds].size.height == 568)

#endif


В коде используем следующие условия:


if (iPhone) {}
if (iPhone5) {}

if (iPad) {}


Оптимальная и быстрая запись условия для bool
vasya

if ([[UIScreen mainScreen] bounds].size.height == 568) {

  iPhone5 = 1;

} else {

  iPhone5 = 0;

}


легко и удобно заменяется на:

iPhone5 = ([[UIScreen mainScreen] bounds].size.height == 568);


Литералы Objective-C в Xcode 4.5
vasya
Массивы.
Было:

NSArray *myArray = [NSArray arrayWithObjects:@"one", @"two", @"three", nil];

Стало:

NSArray *myArray = @[@"one", @"two", @"three"]; //Без nil!


Словари.
Было:

NSDictionary *myDictionary = [NSDictionary dictionaryWithObjectsAndKeys:@"one", @"first", @"two", @"second", nil];

Стало:

NSDictionary *myDictionary = @{@"first" : @"one", @"second" : @"two"}; //Ключ:значение без nil!


Числа.

// integral literals.

NSNumber *fortyTwo = @42;             // = [NSNumber numberWithInt:42]

NSNumber *fortyTwoUnsigned = @42U;    // = [NSNumber numberWithUnsignedInt:42U]

NSNumber *fortyTwoLong = @42L;        // = [NSNumber numberWithLong:42L]

NSNumber *fortyTwoLongLong = @42LL;   // = [NSNumber numberWithLongLong:42LL]


// floating point literals.

NSNumber *piFloat = @3.141592654F;    // = [NSNumber numberWithFloat:3.141592654F]

NSNumber *piDouble = @3.1415926535;   // = [NSNumber numberWithDouble:3.1415926535]


// BOOL literals.

NSNumber *yesNumber = @YES;           // = [NSNumber numberWithBool:YES]

NSNumber *noNumber = @NO;             // = [NSNumber numberWithBool:NO]


Создаем тень под слоем
vasya

self.imageView.layer.shadowOffset = CGSizeMake(0.0, -5.0); //CGSizeZero = CGSizeMake(0.0, 0.0); по умолчанию .shadowOffset = CGSizeMake(0.0, -3.0);

self.imageView.layer.shadowOpacity = 0.8; //Прозрачность

self.imageView.layer.shadowRadius = 5.0; //Радиус скругления углов

self.imageView.layer.shadowColor = [UIColor blackColor].CGColor; //Цвет тени

self.imageView.layer.shadowPath = [UIBezierPath bezierPathWithRect:self.imageView.bounds].CGPath; //Свойство для анимации и лучшего отображения тени, на самом деле хз, для чего это, кроме как для размера тени :)

self.imageMap.layer.shouldRasterize = YES//Некогда объяснять, ставь YES, хуже не будет


Вот так еще можно записывать

self.imageMap.layer.shadowPath = [UIBezierPath bezierPathWithRect: CGRectMake(self.imageView.bounds.origin.x, self.imageView.bounds.origin.y, self.imageView.bounds.size.width - 5.0, self.imageView.bounds.size.height)].CGPath; //Сам разберешься, что значат эти значения ;)


Полезная статья по тени: http://nachbaur.com/blog/fun-shadow-effects-using-custom-calayer-shadowpaths

Поместить фоновое изображение в самый низ представления
vasya

- (void)viewDidLoad

{

    UIImage *myImage = [UIImage imageNamed:@"background@2x.png"];

    UIImageView *backgroundView = [[UIImageView alloc] initWithImage:myImage];

    backgroundView.frame = self.view.bounds;

    [self.view addSubview:backgroundView];

    [self.view sendSubviewToBack:backgroundView]; //Вот, что нам нужно, а сверху код это так, для примера :)

}


Приостановить обработку сенсорных событий
vasya

//Начать игнорирование

[[UIApplication sharedApplication] beginIgnoringInteractionEvents];


//Закончить игнорирование

[[UIApplication sharedApplication] endIgnoringInteractionEvents];


Закругляем изображения, да и всё, что захотим
vasya

#import <QuartzCore/QuartzCore.h>

- (void)viewDidLoad

{

    CALayer *myLayer = [imageView layer]; // Будем округлять UIImageView


    myLayer.cornerRadius = 8.0f; // Задаем радиус для округления.

    myLayer.masksToBounds = YES; // Чтобы за овальной границей в углах ничего не рисовалось

    myLayer.borderWidth = 0.0f; // Границу рисовать не будем. Если нужна - указываем толщину

}


как вариант еще делал сразу

self.view.layer.cornerRadius = 10.0;


Как скачать и показать изображение через URL
vasya

NSURL *url = [NSURL URLWithString:@"http://website.ru/image.png"]; //URL на удаленное изображение

UIImage *image = [UIImage imageWithData: [NSData dataWithContentsOfURL:url]]; //Создаем UIImage из NSData

[self.view addSubview:[[UIImageView alloc] initWithImage:image]]; //Добавляем на наш UIView


Значения NULL и nil
vasya
Значение NULL используется для сброса значений не объектных указателей


MyNonObjectType *pointer = &somedata;

pointer = NULL;


Значение nil используется для сброса значений объектных указателей, то есть указателей на типы производных от NSObject. При этом nil является для них значением по умолчанию.

NSString *myString; //myString = nil. nil - значение по умолчанию


?

Log in

No account? Create an account