Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Не рабоатет авторазмещения для некоторых UIView

Для storyboard включены Autolayout и Size Calsses.
Constraints настроены на 5 View. Для переклбчения между View используется PageController - т.е. реализован механизм слайдинга.
iPhone 4s (iOS 8.4) на все View действует авторазмещение.
iPhone 6 (iOS 8.4) при прочих равных условиях авторазмещение по ширине действует только на первые 2 View.
Пробовал создавать constraints с нуля - не помогает.
Какие могут быть причины?
Ответ:
Цитата(Sartorius @ 11.9.2015,  12:57)
Хм Как-то ты смешиваешь autoresizing и autolayout. Лучше чем-то одним пользоваться наверно. Для того, что бы растянуть view на весь parent нужно установить leading, trailing, top и bottom space constraints относительно superview = 0

Проблема в том, что autoresizing без autolayout не работают и наоборот, даже если будут привязки контролов к границам View.
Вопрос: Прогрузка и ленивая загрузка UIView перед доба...

Есть желание показать UIView c тяжелой картинкой. Я пытаюсь сделать такую загрузку, которая позволит остальной программке работать

Класс этой вью
Код

- (id)initWithSpinset:(NSString*)spinset withSize:(CGSize)size {
    self = [super initWithFrame:(CGRect){0, 0, size}];
    if (!self) return nil;
    
    self.clipsToBounds = YES;
    
    [NSThread detachNewThreadSelector:@selector(loadImage:) toTarget:self withObject:spinset];
    
    return self;
}

- (void)loadImage:(NSString*)spinset {
    NSString *filePath = [[NSBundle mainBundle] pathForResource:spinset ofType:nil];
    NSData *imageData = [[NSData alloc] initWithContentsOfFile:filePath];
    UIImage *spinsetImage = [[UIImage alloc] initWithData:imageData];
    if (!spinsetImage) return;
    
    _spinsetImageView = [[UIImageView alloc] initWithImage:spinsetImage];
    if (_spinsetImageViewPosition)
        _spinsetImageView.frame = CGRectOffset(_spinsetImageView.frame, 0, _spinsetImageViewPosition);
    [self addSubview:_spinsetImageView];
    
    self.isReady = YES;
}


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

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

Это сообщение отредактировал(а) Shklyar - 28.2.2014, 13:30
Ответ:
ну создание UI не может занимать много времени, может много времени занимает что-то другое? Например загрузка картинок или наполнение массивов
Вопрос: Активность UIView

вот до чего добрался.  Изчезает активность у окон (UIView).  Есть, например, View_A из него вызывается другой (View_B), но когда из View_B опять вызываем View_A, все поля на нём (UITextView, UITextField) неактивны.  Т.е. - как-то (программно) содержание в них изменить можно, но на поползновения извне реакции никакой (не выезжает виртуальная клавиатура).

В чём дело быть может?  Неправильный переход между окнами?
Ответ:
а вы переходите из view в view? тогда да, неправильный
Вопрос: Size Classes и свойства frame/bounds у UIView

Всем привет!

Решил в своем pet-проекте заюзать по-полной size classes, и столкнулся со следующей странностью:

Для anyW & anyH поставил размер вьюшки 400x400
Для compactW & regularH - 280х280

Запускаю на айфоне (в симуляторе), визуально отображается все правильно, но в самом подклассе вьюшки, в методе initWithCoder ее размер (self.frame, self.bounds) почему-то 400x400, как задано в sizeClass'е any&any, а не 280х280, как по факту отображается.
Из-за чего дальнейшая работа с вьюшкой становится некорректной, т.к. в методе initWithCoder на нее добавляются разные фичи, ориентируясь по размеру.

Может есть у кого-то идеи, почему такой фокус может происходить?
Ответ: Потому что UIView не изменила свой размер еще. А инициализация ее в -initWithCoder: происходит всегда по той информации, которая в nib файле есть.
Обратите внимание на метод -viewDidLayoutSubviews контроллера.

В вашем случае корректный размер будет только в перегруженном методе -layoutSubviews.

P.S. Более того, используя SizeClasses вы не должны работать напрямую с размерами UIView. Используйте UILayoutConstraints...
Вопрос: Черный экран при смене представления в эмуляторе

Есть 2 представления - книжное и альбомное. При запуске отображается книжное представление. При смене представления с книжного на альбомное (cmd + right) - отображается черный экран. Что не так?

Код

//
//  ViewController.h
//  swap3
//
//  Created by 0xdeadc0de on 05.04.14.
//  Copyright (c) 2014 0xdeadc0de. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController

@property (strong, nonatomic) IBOutlet UIView *portrait;
@property (strong, nonatomic) IBOutlet UIView *landscape;
@end


Код

//
//  ViewController.m
//  swap3
//
//  Created by 0xdeadc0de on 05.04.14.
//  Copyright (c) 2014 0xdeadc0de. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

#define degreesToRadians(x) (M_PI * (x) / 180)

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
    if (toInterfaceOrientation == UIInterfaceOrientationPortrait) {
       
        self.view = self.portrait;
        self.view.transform = CGAffineTransformIdentity;
        self.view.transform = CGAffineTransformMakeRotation(degreesToRadians(0));
        self.view.bounds = CGRectMake(0.0, 0.0, 320.0, 460.0);
        
    } else if (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft) {
       
        self.view = self.landscape;
        self.view.transform = CGAffineTransformIdentity;
        self.view.transform = CGAffineTransformMakeRotation(degreesToRadians(-90));
        self.view.bounds = CGRectMake(0.0, 0.0, 480.0, 300.0);
        
    } else if (toInterfaceOrientation == UIInterfaceOrientationLandscapeRight) {
        
        self.view = self.landscape;
        self.view.transform = CGAffineTransformIdentity;
        self.view.transform = CGAffineTransformMakeRotation(degreesToRadians(90));
        self.view.bounds = CGRectMake(0.0, 0.0, 480.0, 300.0);
   
    }   
}
@end

Ответ:
жалко
Вопрос: Перерисовка кастомного View

Доброго времени суток!
У меня есть класс, унаследованных от UIView, отрисовка объекта этого класса прописана в методе drawRect:. Мне необходимо по нажатию кнопки во ViewController'е циклически перерисовывать view с задержкой в конце каждой итерации. Для этого я вызываю в цикле метод setNeedsDisplay. Но, как показывает отладка, этот метод вызывается не на каждой итерации цикла, а только один раз в конце цикла. Как я понял после поисков в интернете, так сделано с целью повышения производительности. Но в моем случае надо отрисовывать view именно на каждом шаге цикла. Может быть, у кого нибудь есть идеи, как решить эту проблему?
Прикладываю код, в котором пытаюсь циклически перерисовывать view:
Код Objective-C
1
2
3
4
5
6
7
8
- (IBAction)linearAnimation:(id)sender {
    self.linearPolygon.isTransformed = YES;
    for (CGFloat a = -0.4; a < 0.4; a=a+0.1) {
        self.linearPolygon.alpha = a;
        [self.linearPolygon setNeedsDisplay];
        sleep(1);
    }
}
Заранее спасибо.
Ответ: filyakov, я бы добавил - вообще sleep функцию забудьте. Ее не нужно использовать при разработке под iOS. Все решается другими путями.
Вопрос: Контроль установленных приложений

Добрый день. У нас есть партнёрская программа, участники которой получают деньги за установку приложений рекламодателей на своё устройство. Пока мы работали только с Android, но сейчас решили двигаться в сторону iOS.
Под Android у нас есть собственное приложение, которое устанавливают пользователи. Это приложение загружает с сервера задания на выполение и контролирует это.
Текущая задача - создание задания на разработку подобного приложения для iOS. Но пока не совсем понятен ряд механизмов.

Если весь лист методов для обмена информацией с сервером, после некоторых изменений, мы может взять у Andoid-версии, то вопрос контроля работы приложения остаётся открытым. А ещё я никогда не пользовался Apple девайсами, поэтому не знаю элементарных вещей. Через пару дней приедет тестовая трубка, и будет проще - а пока, пожалуйста, извините за тупые вопросы

1). Пользователь должен перейти на сайт iTunes именно по нашей ссылке и установить приложение. Это возможно?
Я имею в виду, можно ли прямо из браузера начинать установку, либо под iOS приложения можно скачивать лишь через фирменный софт от Apple?

2). Как определить конкретное устройство и информацию о его пользователе? (Device ID, версию, информацию о пользователе, и т.д.)

3). Можем ли мы знать, какие приложения сейчас запущены в системе (запущено ли сейчас приложение, которое пользователь должен был скачать по нашей просьбе)

4). Есть ли какая-то возможность получать список установленных за последние N дней приложений?

5). Как можно посылать извещения? Под Andoid мы используем GCM (отправка пуш-уведомлений).

Интересуют ответы для устройств c джэйлбрейком и без него.
Ответ: Feature Points ?
Вопрос: О том как я спорил с Apple насчет порно

Написал одну игрушку, там главная героиня - девушка в бикини
Бикини видно очень хорошо, не ошибешься! К тому же это рисунок а не фото
Эпл не захотел публиковать игру, сказали что девушка спорная (порно типа) в одном из сообщений даже уточнили - девушка в бикини и порекомендовали ее убрать вообще :))))
Я им в ответ закинул список топ 7 программ что быстро нашел в их магазине где девушки не только в бикини (при чем фотки и анимация)
но они вообще без бикини, топлес а некоторые программы даже называются камасутра с позами
Вот ведь какая замысловатая "логика" у эпл...


Ответ:
ахахахаха))
Вопрос: Муки выбора: core data или работа "напрямую" с sqlite

Здравствуйте! Я новичок в разработке под osx и ios, но так как база на сях и плюсах была (когда-то давно), то идет это дело у меня довольно быстро. И пару дней назад передо мной встал следующий вопрос:

Ситуация: на iOS устройстве (пусть это будет фронтенд) требуется хранить (и периодически обновлять без обновления самого приложения) с сервера достаточно большое количество данных (тексты, картинки, некоторые служебные данные). На бэкенде (сервере) это все представлено обычной MySql базой данных с большим количеством таблиц и связей, и встала задача представить то же самое на iOS устройстве. При этом требуется сделать так, чтобы программа на устройство устанавливалась уже с начальным набором данных и дальше, по желанию пользователя, обновлялась с сервера. Основной режим работы приложения - оффлайн. Важно, что пользователь сам данные менять не может, т.е. все таблицы readonly и это, вроде бы, позволяет снять вопросы целостности связей, но мне непривычен такой подход.

Вопрос: что лучше использовать для хранения данных на устройстве, core data или прямую работу с SQLite базой? Прочитав несколько статей (в т.ч. большой кусок core data programming guide) я понял, что не могу принять решение по следующим причинам:
1: я привык работать с "нормальными" базами, где есть ключи, связи, индексы, уникальные значения итд и "нормальными" запросами к бд. В core data я половину из этого не нашел;
2: у самих apple написано "Core Data is not a relational database..." со всеми вытекающими. Насколько "надежно" доверять такой системе, если надо хранить не просто master-detail список покупок с соответствующим представлением в бд? Тут еще раз всплывает вопрос о том, что все таблицы readonly и, по идее, можно вообще наплевать на связи и положиться на логику сервера (что там все таблицы правильные и при обновлениях ничего не "перекосит").
3: процесс начального заполнения до конца неясен (программа должна устанавливаться с изначальным набором данных): сам механизм core data не позволяет подключить созданную и заполненную заранее базу SQLite. Как я понял, выходом тут является создать OSX приложение с core data, создать там пустую модель, заполнить ее данными и закинуть в iOS проект. Но тут мне вообще пока неясно, как совместить структуру на сервере (где есть ссылочная целостность, уники и тд, уже писал выше) и полученный SQLite файл со структурой, которую core data посчитает нужной (конечно, на основе моей схемы, но тем не менее).

На данный момент мне, конечно же, проще будет работать напрямую с SQLite (несмотря на то, что Apple обещает снижение количества кода на 50-70% при использовании КД), но, так как в принципе эта сфера мне нова, мне не хочется беспричинно пользоваться нерекомендуемыми (устаревшими?) технологиями. Поэтому прошу совета опытных в этой сфере людей.

И еще общий вопрос: на одном буржуйском форуме я запомнил фразу, что CoreData для OSX существенно отличается (по логике, не по коду) от CoreData для IOS, но дальнейшего развития эта фраза не получила. Объясните, пожалуйста, что имелось ввиду.
Ответ: Вчера обновились требования к программе, и, видимо, прийдется отказаться от Core Data в пользу SQLite: хоть я и всячески пытался избежать возникновения такой ситуации, но выбора нет: в процессе работы требуется изменять структуру бд (добавлять новые таблицы и связи) без обновления самой программы, чего, как я понял, Core Data не умеет. Значит, буду использовать fmdb, еще раз спасибо за статью и ресурс!
Вопрос: Перелистывание текста на экранах.

Здравствуйте. Простите, только начинаю изучать, поэтому с терминологией пока проблемы. Надеюсь поймёте.

Ситуация примерно такая... Есть View Controller на котором расположен текст. Вокруг всякая мишура (оформление). Хотелось бы, чтобы при проведению пальцем по экрану (слева направо), текущий текст улетал, а появлялся новый. Из массива или БД - не важно. 

Так как я начинающий, то посмотрел некоторые записи, посты и т.д. и сделал два View Controller'a, которые связал через Swipe и вроде как задача частично решилась. Частично, потому как там перелистывание не такое. Но два View Controller'a это не то. Гипотетически, массив строк может включать и 200 строк, поэтому делать для каждой строки свой View Controller кажется глупостью. Отсюда и вопрос. Как можно скролить строки (TextView) горизонтально? По сути человек должен увидеть примерно так: 
текст1 -> махнул пальцем справо-налево -> текст2 -> махнул пальцем справо-налево -> текст 3 -> махнул пальцем слева-направо -> текст2 (то есть вернулись на 1)


Поясните пожалуйста или ссылки какие-то киньте. 

Благодарю.
Ответ:
Мне помогло) спасибо)