Страницы

Поиск по вопросам

Показаны сообщения с ярлыком ios. Показать все сообщения
Показаны сообщения с ярлыком ios. Показать все сообщения

понедельник, 13 апреля 2020 г.

Чтение-запись в Propertylist XCode

#xcode #ios

                    
Здравствуйте!
Для моей программы нужно сохранение данных, но я никак не могу понять как записывать
в plist'ы.
Помогите, пожалуйста.    


Ответы

Ответ 1



Все о .plist'ах Совсем малые объемы данных можете сохранять при помощи NSUserDefaults Если стоит задача хранить большие объемы данных - смотрите в сторону sqlite или Core Data

суббота, 11 апреля 2020 г.

Обрезание блоков на Ipad

#ipad #html #ios #css

                    
При просмотре кода на Ipad'e блоки обрезаны с правой стороны, хотя ширина 100%. В
чем проблема?
http://rghost.ru/55715542    


Ответы

Ответ 1



- это должно помочь width - установите свою ширину По умолчанию ширина окна просмотра на iPhone устанавливается равной 980px. Но ваш дизайн может не соответствовать данному диапазону. Значение может быть для шаблона слишком большим или маленьким. посмотрите здесь

Реализация перемещения тестового UIView и установка текста метки

#ios #xcode #view #gestures #label

                    
Добрый день. Только начала изучать жесты в iOS, выполняю туториал http://www.appcoda.com/ios-gesture-recognizers/.
Дошла до Pan Gesture Recognizer, и здесь возникла проблема: после присвоения меткам
значений вертикальной и горизонтальной скорости, жест "ломается". UIVIew больше не
перемещается плавно вместе с курсором мыши, а перепрыгивает в место, где остановился
курсор мыши. Значения меток обновляются без проблем.
Ниже приведен код, который реализует перемещение тестового вида:

PanViewController.h

@interface PanViewController : UIViewController

@property (weak, nonatomic) IBOutlet UIView *testView;

@property (weak, nonatomic) IBOutlet UILabel *horizontalVelocityLabel;

@property (weak, nonatomic) IBOutlet UILabel *verticalVelocityLabel;

@end

PanViewController.m

@interface PanViewController ()

- (void)moveViewWithGestureRecognizer:(UIPanGestureRecognizer *)panGestureRecognizer;

@end

@implementation PanViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    UIPanGestureRecognizer *panGestureRecognizer = [[UIPanGestureRecognizer alloc]
initWithTarget:self action:@selector(moveViewWithGestureRecognizer:)];
    [self.testView addGestureRecognizer:panGestureRecognizer];

}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

- (void)moveViewWithGestureRecognizer:(UIPanGestureRecognizer *)panGestureRecognizer {
    CGPoint touchLocation = [panGestureRecognizer locationInView:self.view];

    self.testView.center = touchLocation;


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

    CGPoint velocity = [panGestureRecognizer velocityInView:self.view];

    self.horizontalVelocityLabel.text = [NSString stringWithFormat:@"Horizontal Velocity:
%.2f points/sec", velocity.x];
    self.verticalVelocityLabel.text = [NSString stringWithFormat:@"Vertical Velocity:
%.2f points/sec", velocity.y];


}


Как мне исправить эту "поломку"? Очень хочется понять, что же я неправильно делаю,
а не продолжать дальнейшее обучение, не разобравшись до конца с проблемой.
Заранее спасибо.
    


Ответы

Ответ 1



Все потому, что при передвижении Вы ставите UIView в центр, а нужно расчитывать и устанавливать frame: - (void)moveViewWithGestureRecognizer:(UIPanGestureRecognizer *)panGestureRecognizer { //CGPoint touchLocation = [panGestureRecognizer locationInView:self.view]; //self.testView.center = touchLocation; CGPoint translation = [panGestureRecognizer translationInView:panGestureRecognizer.view]; CGRect newFrame = self.testView.frame; newFrame.origin.y = newFrame.origin.y + translation.y; newFrame.origin.x = newFrame.origin.x + translation.x; self.testView.frame = newFrame; [panGestureRecognizer setTranslation:CGPointZero inView:panGestureRecognizer.view]; CGPoint velocity = [panGestureRecognizer velocityInView:self.view]; self.horizontalVelocityLabel.text = [NSString stringWithFormat:@"Horizontal Velocity: %.2f points/sec", velocity.x]; self.verticalVelocityLabel.text = [NSString stringWithFormat:@"Vertical Velocity: %.2f points/sec", velocity.y]; } Этот код будет работать только если у Вас будет выключен Autolayout. Если же Autolayout включен, то для этого можно посмотреть вот это обсуждение https://stackoverflow.com/questions/16129988/ios-dragged-view-is-jumping-back-to-original-position-auto-layout-combined Вы можете посмотреть реализацию моего кода без autolayout: https://cloud.mail.ru/public/2g1Y/EC19pnX2P

Ответ 2



Лучше не используйте frame или center, используйте для этого NSLayoutConstaint создайте @property (weak, nonatomic) IBOutlet NSLayoutConstaint *testViewLeft; дальше двигайте ее: self.testViewLeft.constant = newValue; [self.view layoutIfNeeded]; чтобы это происходило с анимацией, поместите layoutIfNeeded() в блок анимации [UIView animateWithDuration: 0.1 animations: ^{ [self.view layoutIfNeeded]; } completion: nil]; сохраните offset точки начала жеста от края view, это поможет сделать движение более плавным вначале @property (nonatomic) CGFloat panOffset; к тому же в action проверяйте состояние жеста: - (void)panGestureStateChanged:(UIPanGestureRecognizer *)sender { switch (sender.state) { case UIGestureRecognizerStateBegan: self.panOffset = sender.locationInView(contentContainerView).x break; case UIGestureRecognizerStateChanged: CGFloat touchPoint = [sender locationInView:view]; CGFloat newConstant = touchPoint.x - offset; self.testViewLeft.constant = newConstant; [UIView animateWithDuration:0.03 animations:^{ [self.view layoutIfNeeded]; } completion: nil]; break; case UIGestureRecognizerStateEnded: panOffset = 0; break; default: break; } } еще полезным будет стать UIGestureRecognizerDelegate и реализовать метод, чтобы контроливать когда следует начинать жест, а когда нет: - (BOOL)gestureRecognizerShouldBegin(UIGestureRecognizer *)gestureRecognizer { if (gestureRecognizer == self.myPanGesture) { return (someGestureBeginConditions > 0); } return true; }

Apple сделала reject приложению

#ios #objective_c #apple

                    
Ребята, у меня в принципе простое приложение. Которое должно проигрывать музыку посредством
AVPlayer'a. 
Вроде все хорошо, сделал чтобы она играла и тогда когда приложение идет в background.

Но я все сделал так как Apple говорит Здесь

И так: 


  First, declare your application provides specific background services
  and must be allowed to continue running while in the background. To do
  this, add the UIBackgroundModes key in your app's Info.plist file. Its
  value is an array that contains one or more strings that identify
  which background tasks your application supports. Specify the string
  value audio to indicate the application plays audible content to the
  user while in the background:


Плюс так:


  Listing 1  Setting the audio category to allow playback when the
  screen locks or when the Ring/Silent switch is set to silent.


#import 
#import 

AVAudioSession *audioSession = [AVAudioSession sharedInstance];

NSError *setCategoryError = nil;
BOOL success = [audioSession setCategory:AVAudioSessionCategoryPlayback error:&setCategoryError];
if (!success) { /* handle the error condition */ }

NSError *activationError = nil;
success = [audioSession setActive:YES error:&activationError];
if (!success) { /* handle the error condition */ }


Но сегодня пришел реджект со словами:


  
    June 17, 2015 at 6:12 AM От: Apple
    2.16 - Multitasking Apps may only use background services for their intended
purposes: VoIP, audio playback, location, task completion,
    local notifications, etc.
    2.16 Details
  
  
  Your app declares support for audio in the UIBackgroundModes key in
  your Info.plist, but we were unable to play any audible content when
  the application was running in the background.
  
  Next Steps
  
  The audio key is intended for use by applications that provide audible
  content to the user while in the background, such as music player or
  streaming audio applications. Please revise your app to provide
  audible content to the user while the app is in the background or
  remove the "audio" setting from the UIBackgroundModes key.
  
  Resources
  
  If you have difficulty reproducing a reported issue, please try
  testing the workflow described in Technical Q&A QA1764: How to
  reproduce bugs reported against App Store submissions.
  
  If you have code-level questions after utilizing the above resources,
  you may wish to consult with Apple Developer Technical Support. When
  the DTS engineer follows up with you, please be ready to provide:
  - complete details of your rejection issue(s)
  - screenshots
  - steps to reproduce the issue(s)
  - symbolicated crash logs - if your issue results in a crash log


Подскажите что не так делаю, запутался если честно((

Заранее спасибо!
    


Ответы

Ответ 1



В принципе все так как советовал товарищ Sega-Zero. в коде исправил мелкие недочеты написал развернутое сообщение интервьюеру, от том как правильно запустить и зачем, а главное когда нужно воспроизведения музыки в фоне После чего получил одобрение в apple store.

четверг, 9 апреля 2020 г.

PUSH уведомления [закрыт]

#android #ios #notifications

                            
             
                
                    
                        
                            Закрыт. Этот вопрос не по теме. Ответы на него в данный
момент не принимаются.
                            
                        
                    
                
            
                    
                
                        
                            
                        
                    
                        
                            Хотите улучшить этот вопрос? Переформулируйте вопрос,
чтобы он соответствовал тематике «Stack Overflow на русском».
                        
                        Закрыт 4 года назад.
                    
                
        

В проекте необходимо реализовать механизм PUSH уведомлений.
Проект идет на двух платформах - Android и iOS.

Есть конкретные вопросы.


Мне обязательно надо регистрировать приложения в сервисах - APNS для iOS и GCM для
Android или это можно избежать если пользоваться сторонними сервисами?
Как получить уникальный регистрационный TOKEN для iOS и Андроид, какие библиотеки
для этого используются?
Какие сервисы вы можете посоветовать для упрощения данной задачи? Желательно с хорошей
документацией по описанию API и примерами приложений для каждой из платформ.
Ну и возможно вы посоветуете для каждой из платформ хорошие статьи с примерами, где
все объясняется по пунктам.

    


Ответы

Ответ 1



Отвечу только по части iOS: Да, надо. Ответ на этот вопрос содержится тут. Никакие библиотеки не нужны, главное помнить, что токен можно получить, и, соответственно, протестировать только на реальном устройстве, а не симуляторе. Чтобы протестировать приём уведомлений можете воспользоваться этой утилитой. Могу посоветовать вот эту статью и вот это видео.

Ответ 2



Есть кроссплатформенные реализации Push нотификаций. Например копните Amazon Web Services или parse.com (parse.com по моему реализован на AWS)

Как нарисовать рваную линию?

#ios #objective_c #swift

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

[Обновление] Задача упростилась, теперь просто нужно узнать как рисовать линию изображением.
    


Ответы

Ответ 1



Я так понимаю, единственный вариант это накладывать одно и то же изображение снова и снова, каждый раз, когда курсор смещается. В том примере, который у вас просто рисуется одно и то же изображение, именно так, как я описал в комментарии выше. просто изображение необычной формы и по краям, судя по всему есть полупрозрачные пиксели. если предположить, что у вас есть заднее изображение и переднее. то вам надо по клику в переднем изображении создавать прозрачный кусок установленной формы. вот пример с SO как это сделать // get access to the image bytes CFDataRef pixelData = CGDataProviderCopyData(CGImageGetDataProvider(image.CGImage)); // create a buffer to hold the mask values size_t width = CGImageGetWidth(image.CGImage); size_t height = CGImageGetHeight(image.CGImage); uint8_t *maskData = malloc(width * height); // iterate over the pixel data, reading the alpha value uint8_t *alpha = (uint8_t *)CFDataGetBytePtr(pixelData) + 3; uint8_t *mask = maskData; for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { *mask = *alpha; mask++; alpha += 4; // skip to the next pixel } } // create the mask image from the buffer CGDataProviderRef maskProvider = CGDataProviderCreateWithData(NULL, maskData, width * height, NULL); CGImageRef maskImage = CGImageMaskCreate(width, height, 8, 8, width, maskProvider, NULL, false); // cleanup CFRelease(pixelData); CFRelease(maskProvider); free(maskData); Потом, чтобы все это запустить сделать: CGImageRef subtractedImage = CGImageCreateWithMask(b.CGImage, maskImage); Еще добавлю, что этот фокус скорее всего будет есть очень много ресурсов для большой картинки. может есть смысл поделить на несколько маленьких.

Ответ 2



Менее ресурсоемким решением было бы использование GLKit, работало бы быстро и на всех девайсах, но не на всех iOS, кажется начиная с iOS 7. С другой стороны, можно поиграться с CGPath, UIBezierPath, маской картинкой и получить "почти" тот же результат, ключевое слово почти :) UPD: Приведу пару ссылок Линк 1 Линк 2 Линк 3

вторник, 31 марта 2020 г.

unity внутри игровые покупки

#android #ios #unity3d


Вопрос: Есть ли разница между настройкой(IAP) внутри игровых покупок для Android и IOS?

Нашел огромное количество материала по андроиду,но не по ios.

Возможно что-то упустил,если есть у кого-то полезные ссылки(кроме официальной документации)
на статьи и тд скиньте пожалуйста(желательно не 2017-2018 гг).
    


Ответы

Ответ 1



Почти нет разницы, если пользоваться готовым UnityIAP. Официальный туториал. Там, разве что, структура ответа отличается. Но если вы на свои серваки посылать receipt на валидацию не собираетесь, то и это не важно.

пятница, 20 марта 2020 г.

IPad и виртуальная машина Java

#ipad #java #ios #jvm


Кто-нибудь слышал об Java-машине на IPad'е? А то уж очень хочется java-код писать
под IPad, а не на Objective C.    


Ответы

Ответ 1



нет! и никогда не будет! забудьте! язык разработки приложений только обджект-си - если реально смотреть на вещи - то допустить джава машину на iOS и компания потеряет деньги. поэтому никогда джава машины не будет на iOS.

Ответ 2



The iPad Guide Does the iPad support Java? No. iPhone OS 3.2 will not support Java. The iPhone does not support Java. Steve Jobs has been quoted as saying "Java's not worth building in. Nobody uses Java anymore. It's this big heavyweight ball and chain." Java fans should not expect Apple to reverse this long-standing decision on the iPad.

четверг, 19 марта 2020 г.

Сохранение данных в ios

#xcode #ios


Только начал изучать разработку под ios ( до этого занимался web прогр.). Например
я хочу сделать мультиязычное приложение. Пользователь выбирает в настройках язык (настройки
сохраняются), после этого меняется язык в приложении на нужный.


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

    


Ответы

Ответ 1



http://www.raywenderlich.com/2876/how-to-localize-an-iphone-app-tutorial Посмотрите этот туториал, довольно доступно все описано

Ответ 2



Давайте по порядку: В iOs нет такого понятия как выбранная локализация приложения, приложение подцепляет ту локализацию, на которое настроено устройство (в настройках-стандартные-язык), делать свой велосипед с выбором локали будет неправильно. Ссылку как добавить локализацию чтобы ее подцепило приложение уже дал выше @AlexThumb За работу с настройками в iOs отвечает класс NSUserDefaults, при желании туда даже можно будет запустить свои кастомные классы, упаковав их через NSKeyedArchiver. По базам данных - можно спокойно работать с sqlite, взаимодействие через его С-апи входит в стандартный сдк, но здесь он вам не нужен

вторник, 17 марта 2020 г.

Вопрос про UITableView и UITableViewCell в iOS

#ios #uitableview


Доброе время суток коллеги!
Столкнулся с такой задачей. Необходимо выводить информацию в UITableView в два кастомных
UITableViewCell. верхний как бы заголовок, нижний текст с произвольной высотой. Если
кликать на заголовок необходимо попадать на профиль пользователя, если кликать на текст
попадать на полный текст статьи. Пример реализации которая мне нужна хорошо выполнен
в приложении ВКонтакте для iphone, в разделе группы. У меня не получается вывести данные
в два UITableViewCell по очереди. 
https://www.dropbox.com/s/g1g6btk4zudrhr1/screen.pdf
В приложенном файле я нарисовал прототип того как должен выглядеть табличный вид
на мобильном телефоне. 
Если кто сталкивался или знает как это можно реализовать прощу помочь.    


Ответы

Ответ 1



После обсуждения этого вопроса с его автором в скайпе мы совместно выяснили, что оба вида ячеек на самом деле относятся к одной сущности (пользователю и контенту, связанному с ним) и решили, что нужно, чтобы был создан только один тип ячейки, в которую контент нынешних двух типов ячейки войдет в виде двух subviews - один subview для заголовка ячейки (информация о пользователе), другой - для контента (сообщение пользователя). Главная же проблема скрывалась в том, что из-за наличия двух видов ячеек, автор, полагаясь на строку вида EXHeaderTableCell *headerCell = [tableView dequeueReusableCellWithIdentifier:HeaderCellIdentifier forIndexPath:indexPath]; получал неправильное обращение к индексу в массиве Reusable cells, так как indexPath в большинстве случаев указывал на ячейку противоположного типа.

Ответ 2



- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellPersonIdentifier = @"CellPersonIdentifier"; static NSString *CellDataIdentifier = @"CellDataIdentifier"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:(indexPath.row % 2 == 0 ? CellPersonIdentifier : CellDataIdentifier)]; if (cell == nil) { NSArray *nib = [[NSBundle mainBundle] loadNibNamed:(indexPath.row % 2 == 0 ? @"CellPerson" : @"CellData") owner:self options:nil]; cell = [nib objectAtIndex:0]; } // далее заполняешь ячейки данными }

Получение идентификатора в iOS 7 (UDID, OpenUDID, UUID, и т.п)

#xcode #ios #objective_c


В приложении требуется получение идентификатора, но так как UDID запретили использовать
еще в iOS 6, я вынужден спрашивать вас :C. Что может заменить UDID? 
Пробовал NSUUID
NSString *uuid = [[NSUUID UUID]
UUIDString];

Меняется после переустановки приложения.
Пробовал "IDFV" Identifier for Vendor:
NSString *idfv = [[[UIDevice
currentDevice] identifierForVendor]
UUIDString];

Но он тоже меняется (и не понятно почему, он бывает снова возвращает старый идентификатор).
Так же хотел попробовать Advertiser Identifier, но ASIdentifierManager и advertisingIdentifier
не распознается xCode. Программа уже готова для обновления в xCode и в iTunesConnect,
уже перед заливкой в iTunes заметил что идентификатор менялся. Пожалуйста подскажите
уже готовым решением, до 18:00 планирую залить в iTunes. Заранее большое спасибо).    


Ответы

Ответ 1



Дак это UIID на то и UIID - он должен быть разным каждую долю сикунды во всем мире один такой. Если вы хотите не изменяемый UIID, то раньше, да использовали идентификатор устройства. В связи с чем рекламщики злоупотребляли сбором данной информации. И теперь эта функция контралируется пользователем. На сегодняший день мы вышли из данной ситуации зпросом MAC адреса GSM/Wi-Fi подулей, после хеша md5-подобной функции мы получили UID. Вот пример реализации: @implementation TCMacAddress + (NSString *)getMacAddress { int mgmtInfoBase[6]; char *msgBuffer = NULL; size_t length; unsigned char macAddress[6]; struct if_msghdr *interfaceMsgStruct; struct sockaddr_dl *socketStruct; NSString *errorFlag = NULL; // Setup the management Information Base (mib) mgmtInfoBase[0] = CTL_NET; // Request network subsystem mgmtInfoBase[1] = AF_ROUTE; // Routing table info mgmtInfoBase[2] = 0; mgmtInfoBase[3] = AF_LINK; // Request link layer information mgmtInfoBase[4] = NET_RT_IFLIST; // Request all configured interfaces // With all configured interfaces requested, get handle index if ((mgmtInfoBase[5] = if_nametoindex("en0")) == 0) errorFlag = @"if_nametoindex failure"; else { // Get the size of the data available (store in len) if (sysctl(mgmtInfoBase, 6, NULL, &length, NULL, 0) < 0) errorFlag = @"sysctl mgmtInfoBase failure"; else { // Alloc memory based on above call if ((msgBuffer = malloc(length)) == NULL) errorFlag = @"buffer allocation failure"; else { // Get system information, store in buffer if (sysctl(mgmtInfoBase, 6, msgBuffer, &length, NULL, 0) < 0) errorFlag = @"sysctl msgBuffer failure"; } } } // Befor going any further... if (errorFlag != NULL) { NSLog(@"Error: %@", errorFlag); return errorFlag; } // Map msgbuffer to interface message structure interfaceMsgStruct = (struct if_msghdr *) msgBuffer; // Map to link-level socket structure socketStruct = (struct sockaddr_dl *) (interfaceMsgStruct + 1); // Copy link layer address data in socket structure to an array memcpy(&macAddress, socketStruct->sdl_data + socketStruct->sdl_nlen, 6); // Read from char array into a string object, into traditional Mac address format NSString *macAddressString = [NSString stringWithFormat:@"%02X:%02X:%02X:%02X:%02X:%02X", macAddress[0], macAddress[1], macAddress[2], macAddress[3], macAddress[4], macAddress[5]]; //NSLog(@"Mac Address: %@", macAddressString); // Release the buffer memory free(msgBuffer); return macAddressString; } @end

Ответ 2



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

Apple push notification - как правильно отобразить нужный контроллер?

#objective_c #ios #apple #ios7


Доброе время суток! В общем столкнулся с проблемой, приходит уведомление, скажем
"Вам пришло новое сообщение", мне необходимо открыть чат с этим пользователем, но что
бы попасть в чат, нужно прочти 3 экрана от стартового, либо же пользователь не выходит
с приложения, а заблокировал телефон на контроллере чата, подскажите пожалуйста, каким
образом нужно/можно/будет правильно открывать нужный контроллер? Если к нему нужно
добиратся через 3-9 земель? или не наоборот?
Заранее спасибо за помощь!     


Ответы

Ответ 1



Думаю здесь больше зависит от архитектуры приложения. Вот у меня, например, несколько NavigationControllers и у каждого есть переход в чат. Дак контрол чата принимает на вход модель собеседников и таким образом я могу его вызвать в любом месте через пуш, сформулировав перед этим все модели данных для чат контрола. - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { UINavigationController *navController = (UINavigationController *)self.window.rootViewController; NotificationViewController *notificationViewController = [[NotificationViewController alloc] init]; [navController.visibleViewController.navigationController pushViewController:notificationViewController]; } Но в этом примере я пушаюсь сразу же в чат без промежуточных экранов. Если же задача стоит именно пропушиться туда где чат пройдя по промежуточным экраном, то тут нужно придумать какой-нибудь алгоритм переходов с неким path пушей экранов с анимацией, с блоком завершения анимации и пушингом следующего контрола в path . В общем много вариантов, на самом деле, все зависит от ТЗ.

воскресенье, 15 марта 2020 г.

Рассчитать размер прямоугольника с текстом

#ios #objective_c #swift


В делегате func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath:
NSIndexPath) -> CGFloat я должен высчитать высоту моего текста в UILabel. Какими путями
мне это сделать, скажите, пожалуйста?

upd1(к первому комментарию) :

    let text = self.posts[indexPath.row]["story"]! as NSString
    let sizeOfLabel = text.boundingRectWithSize(
        CGSize(width: <>, height: Int.min),
        options: NSStringDrawingOptions.UsesLineFragmentOrigin,
        attributes: ["NSFontAttributeName":UIFont.systemFontOfSize(17)],
        context: nil)

    


Ответы

Ответ 1



Если я правильно понял, то у Вас проблема с размером UILabel в UITableView. При создании вашей UILabel в методе UITableViewDataSource нужно указать yourLabel.layoutIfNeeded(). Если это не то, опишите проблему точнее

Ответ 2



extension UILabel { func calculateHeight() -> Float { let text = self.text as NSString let size = text.sizeWithAttributes([NSFontAttributeName: self.font]) return size.height } }

Ответ 3



То, что у вас в апдейте должно работать, единственноheight не минимальный а максимальный let sizeOfLabel = text.boundingRectWithSize( CGSize(width: <>, height: DBL_MAX), options: NSStringDrawingOptions.UsesLineFragmentOrigin, attributes: ["NSFontAttributeName":UIFont.systemFontOfSize(17)], context: nil)

понедельник, 9 марта 2020 г.

Как работать с TCP в Swift?

#ios #swift #tcp_ip


У меня есть TCP сервер, который слушает входящие команды и общается с БД. Как мне
слать к нему запросы из ios приложения? Работаю со swift 2.

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

Никак не могу понять, как мне такое реализовать. Насколько я понимаю, мне нужно работать
с потоками, но ничего путного про это на ios я не нашел.
    


Ответы

Ответ 1



Если я Вас правильно понял, то потоки Вам вовсе не нужны. Тут надо использовать блоки. Скажем Вы отправляете запрос и включаете индикатор загрузки, а когда приходит ответ Вы прекращаете загрузку и в зависимости от результата с сервера используете success или же failure блок. Советую использовать AFNetworking. Что-то на подобии let manager = AFHTTPRequestOperationManager() manager.GET( "http://myServerUrl.com", parameters: ["email":"myemail@gmail.com", "password":"1234Password"], success: { (operation: AFHTTPRequestOperation!, responseObject: AnyObject!) in //TODO - make login action }, failure: { (operation: AFHTTPRequestOperation!, error: NSError!) in // TODO - show error message } )

Ответ 2



На сколько я понимаю вам необходимо выполнить HTTP запрос авторизации пользователя к вашему серверу и получить какой то ответ. Для работы с сетью на Swift вам подойдет Alamofire. Самый простой пример выполнения GET запроса: Alamofire.request(.GET, "https://yourserver.org/get", parameters: ["name": "user", "pass": "12345"]) .responseJSON { response in print(response.result) // result of response serialization } Более подробные примеры запросов приведены в описании либы.

вторник, 25 февраля 2020 г.

Нужна ли обратная связь в мобильном приложении?

#android #windows_phone_7 #ios #iphone


Доброго времени суток, Господа!
Только что поучаствовал в споре — «а нужна ли обратная связь в мобильном приложении?»
Я с читаю что нужна, потому что когда я пользуюсь приложениями, иногда возникает
необходимость сообщить о каком то баге, неудобстве или еще о чем-нибудь, но очень редко
встречается, что приложение имеет такую функцию, а идти на маркет, искать это приложение
и писать туда отзыв, не очень приятное занятие(я ленивый). Так вот, может у кого-то
был уже подобный опыт или кто-то сталкивался с таким вопросом и к чему это привело,
поделитесь пожалуйста. 
Какие аргументы мне привели против:
— слишком навязчиво получается, если по-твоему… Ты с хабра! Ты учить будешь! А мне
не надо ниче.
PS: моя идея реализации такова: текстбокс и кнопка отправить, никаких пользовательских
данных передаваться не будет.    


Ответы

Ответ 1



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

Ответ 2



Не знаю как там насчет WP7 и iOS, но в Android: Возможность фидбека при падении приложения по умолчанию встроена в Android, при согласии юзера крэш репорт отсылается разработчику Для Android существует огромное количество либ/инструментов для организации обратной связи - в основном они используются для маркетинга, выдачи рекламных баннеров (в зависимости от страны, аппарата, сети и проч.) - бессмысленно их перечислять, достаточно погуглить Google недавно запустил сервис Google Cloud Messaging, который позволяет пересылать девелоперу сообщения в свою аппу В общем и целом в сумме, рынок движется в сторону интенсификации связи приложение <-> девелопер. Так что считаю, это нужная и полезная штука.

Ответ 3



Сейчас работаю над IOS приложением где на каждом контроллере маленькая кнопка инфо в углу. По нажатию открывается форма обратной связи с разработчиками. Это было требованием по тз и я считаю это абсолютно верным, так как Вы как разработчик получаете возможность быстрого и вероятно всеобъемлющего тестирования ресурсами других людей, и возможность быстро залатать баги или протестить функционал при внедрении обновления например. Плюс меньше будет негативных отзывов в аппсторе если все же будут баги. А чтобы ненавязчиво было - подключайте UI дизайнера. И все будет отлично

Ответ 4



ИМХО, возможность фидбека была бы не плохой, однако любые отчеты об ошибках должны отправляться в автоматическом режиме, либо с разрешения пользователя(для экономии трафика). Также хочу уточнить пользовательские данные ДОЛЖНЫ отправляться. Будь то id телефона или же уникальный id для копии приложения. Как минимум это должно быть реализовано для банально защиты от флуда в фидбек и соответственно реализованы механизмы его предотвращения на сервере и возможно в приложении. Так же я считаю что фидбек не должен находится на видном месте и мозолить глаза пользователя. Лучшим вариантом запрятать эту функцию куда нибудь в настройки или же в информацию о ПО. Возможно даже лучшим вариантом было бы простая ссылка на очень легкую страницу для фидбека. Повторяю все вышеописанное - мое мнение и не претендует на истину.

Библиотека для работы с JSON для iOS

#xcode #objective_c #ios #json #библиотеки


Нашел следующие библиотеки:

SBJSON
JSON kit
Touch JSON (как я понял устарел и не поддерживается)

хочется поинтересоваться что пользуется бОльшим успехом и какие особенности этих
библиотек. И возможно какая лучше.     


Ответы

Ответ 1



Советую выбирать Вам между NSJSONSerialization и JSONKit. Про разницу между ними ничего особенного не скажу, обе библиотеки делают свое дело. Что касается их производительности, то разница у них незначительная (JSONKit быстрее, но не намного) и к тому же редко когда вы столкнетесь с тем, что именно производительность разбора JSON будет для вас bottleneck. Смотрите на эту тему очень поучительный комментарий автора библиотеки RestKit. Единственный довод за NSJSONSerialization - это отсутствие лишней зависимости от сторонней библиотеки (я имею в виду зависимость от JSONKit в случае, если вы выберете её), хотя, если вы пользуетесь Cocoa pods, этот довод становится совсем еле заметным. Довод против NSJSONSerialization и в пользу JSONKit - это что JSONKit удобнее в использовании - я пользуюсь JSONKit главным образом из-за того, что она добавляет удобные категории к классам NSArray, NSDictionary, NSString. И вместо того, чтобы писать каждый раз заново строки NSJSONSerialization типа NSJSONSerialization *yourResponse = [NSJSONSerialization JSONObjectWithData:yourData options:0 error:&jsonError]; NSArray *yourObjects = (NSArray *)yourResponse; При использовании JSONKit Вам достаточно будет написать NSArray *yourObjects = yourData.objectFromJSONData; На мой взгляд это удобно и незаметно. Настолько незаметно, что я даже не сразу вспомнил какой JSON-библиотекой я пользуюсь, когда прочитал Ваш вопрос. ОБНОВЛЕНО ПОЗЖЕ Мой взгляд на этот вопрос изменился с тех пор, как я отвечал на него полтора месяца назад. Сейчас я бы советовал использовать исключительно родной NSJSONSerialization. Вот несколько причин: JSONKit, похоже, накрепко заброшен автором. Xcode 5 выдаёт очень много Warning'ов по поводу JSONKit, как он есть, и автор никак не реагирует на соответствующие репорты (если интересно, см. многочисленные issues вроде #121 в его репозитории на Github). Вот эти Тесты производительности на SO показывают, что NSJSONSerialization работает быстрее или как минимум наравне с JSONKit (начиная с iOS 6). Если вы используете для работы с сетью AFNetworking, то он за кулисами разбирает JSON с помощью NSJSONSerialization, и вам вообще не нужно думать о том, какой JSON парсер выбирать и использовать, так как за вас всё уже сделано и вы получаете готовые свои ответы уже завернутые из JSON в NSDictionary/NSArray. Кратко: используйте NSJSONSerialization!

Ответ 2



Мне нравится NSJSONSerialization, вполне самодостаточен, и да чутка не удобен. Очень нравится KISSXML к нему есть категории расширяющие работу с JSON и XML. ну и я за JSONKit Сравнение

IPhone Developer Account в Украине

#xcode #ios


Доброго времени суток всем. Я решил приобрести сертификат iOS разработчика и столкнулся
со множеством проблем, вообще не понимаю, как я буду получать деньги с продаж, какую
карту привязать к аккаунту, какие законы я нарушаю и все такое... Кто занимается разработкой
в Украине - поделитесь опытом, пожалуйста, расскажите, как все сделать правильно.
Спасибо.    


Ответы

Ответ 1



Привет! Распишу подробнее как дело обстояло у меня. Я сходил в ближайшее отделение приват банка, узнал у сотрудника возможность получить валютную карту. Для регистрации в iOS Developer Program нужна именно валютная карта. Ждал я карту 10 дней. Ее делают "на заказ". На карте была фотография, имя держателя карты, срок действия, а также CVV код. Как зарегистрироваться? Тут все стандартно. Получили нашу валютную карту, пополнили ее на 100$. Я просто перевел деньги с гривневой карты на валютную. При переводе UAH конвертируется в USD по текущему курсу. Далее идем на developer.apple.com и регистрируемся. Регистрация в Apple Developer Program простой процесс. Там заполняем нужные поля: имя, фамилия, город и прочее. Внимательно проверяем номер карты, который ввели, а также имя держателя карты. Какую карту потом привязываем к учетной записи? Привязываем нашу валютную карту, вводим имя держателя карты и МФО. Как я буду получать деньги с продаж? Выплаты производятся ежемесячно, если сумма превышает 150$. Если к примеру пришла сумма 140$, то она автоматически переносится на следующий месяц. Когда деньги попадают на карту, приходит SMS. Какие законы я нарушаю? Да вроде бы ничего не нарушаешь Если остались вопросы - спрашивай :)

понедельник, 24 февраля 2020 г.

Проверка пароля при вводе в TextField

#ios #xcode #swift #apple


Подскажите пожалуйста, у меня есть TextField в который я ввожу пароль. После добавления
нового символа мне необходимо проверять соответствие пароля некоторым требованиям (например
8 символов). Как можно этого добиться?
Заранее спасибо)
    


Ответы

Ответ 1



Самый простой вариант: 1 2 Задаете тип Connection - Action, Type - UITextField, Event - Editing Changed. 3 Проверяете что необходимо. К примеру, длина введенного текста 8 и больше символов: @IBAction func myTfToCheck(_ sender: UITextField) { if let text = sender.text { let textLength = text.characters.count if textLength > 7 { //Do something print("\(text), length: \(textLength)") } } }

Ответ 2



Можно использовать готовый валидатор, этот TextFieldValidator для obj-c, но и под свифт аналогов тьма. Множество настроек, подсказки юзеру, проверка на совпадение паролей и тд.

Ответ 3



Вот ссылка, тут есть все что вам надо ) https://stackoverflow.com/questions/25223407/max-length-uitextfield Чуть не забыл, не забудьте прописать делегат в расширении класса - UITextFieldDelegate и указать этот делегат своему TextField yourTextField.delegate = self Пользуйся.

пятница, 14 февраля 2020 г.

Переход в настройки батареи Swift

#ios #swift


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


Ответы

Ответ 1



Начиная с iOS 11 разрешено открыть программно только настройки своего приложения. Плюс, если Вы все же сделаете это для прошлых версий (App-prefs:root=...), то с большой вероятностью приложение будет отклонено с формулировкой: Your app uses the "prefs:root=" non-public URL scheme Можете пользователю предложить перейти в нужный пункт меню настроек и показать инструкцию как именно.

Ответ 2



Targets -> Ваше приложение -> Info -> URL Types -> + В поле URL Schemes добавьте prefs Для вызова: UIApplication.shared.open(URL(string: "App-prefs:root=BATTERY_USAGE")!) Вот тут можете посмотреть доступные URL Schemes

четверг, 13 февраля 2020 г.

Как изменить цвет NavigationBar, StatusBar и TabBar в iOS7 без градиентов ?

#ios #ios7


Пробовал изменить цвет интерфейса следующим образом
[[UINavigationBar appearance] setBackgroundColor: [UIColor redColor]];
[[UITabBar appearance] setBackgroundColor: [UIColor redColor]];

но вместо ярко-красного цвета получил бело-розовый, как это исправить без установки
картинок на задний фон?     


Ответы

Ответ 1



Apple: Setting tintColor property by using the appearance proxy APIs is not supported in IOS 7 Попробуйте: [self.navigationController.navigationBar setBarTintColor: [UIColor blackColor]]; И учтите что tintColor берется от родителя. По поводу статус-бара.

Ответ 2



navigationController.navigationBar.barTintColor = [UIColor redColor]; Use tintColor to tint bar button items. Use barTintColor to tint the bar background.