Пользовательский интерфейс просмотра Изменить размер кадра - PullRequest
2 голосов
/ 02 ноября 2011

У меня есть пользовательский UIView, который рисует изображение в методе рисования прямоугольника. Моя проблема в том, что UIView хочет, чтобы я инициировал initWithFrame при выделении объекта. Рамка вида должна соответствовать размеру и ширине изображения. Проблема в том, что я не получаю размер и ширину изображения до тех пор, пока не создадим метод drawRect для создаваемого мной вида. В представлении drawRect изменение рамки UIView в соответствии с размерами изображения, похоже, не имеет никакого эффекта. Так что я хочу сделать что-то вроде этого:

MyCustomView *myCustomView = [[MyCustomView alloc] initWithFrame: CGrectMake(0,0,0,0)];

Затем внутри метода drawRect в MyCustomView я хочу каким-то образом изменить рамку вида так, чтобы она соответствовала размеру создаваемого изображения.

Как мне получить желаемый результат? Нет, создание изображения до того, как я начну свой пользовательский просмотр, и добавление размеров в initWithFrame - не вариант.

Это мой текущий код в методе drawRect представления

UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"%@",self.imgName]];
CGSize imgSize = [image size];
CGRect newrect = CGRectMake(self.frame.origin.x, self.frame.origin.y, imgSize.width, imgSize.height);
self.frame = newrect; //This does nothing!!
CGRect imgRect = CGRectMake(0, 0, imgSize.width, imgSize.height);
[image drawInRect:imgRect];

Ответы [ 3 ]

5 голосов
/ 02 ноября 2011

Если вы посмотрите документы для setFrame, то там будет написано:

Этот метод, при установке прямоугольника рамки, перемещает и изменяет размеры приемник в системе координат своего суперпредставления. Это ни повторно отображает приемник и не помечает его как нуждающийся в отображении. Ты должен сделать это самостоятельно с помощью display или setNeedsDisplay:.

Он не будет отображаться повторно - обычно после установки фрейма, который вы называете setNeedsDisplay. но это подчеркивает вашу проблему с курицей и яйцом. setNeedsDisplay приводит к тому, что drawrect срабатывает.

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

Я бы либо создал шаблон инициализации (даже если вы сказали, что не вариант), либо создал бы свойство для установки изображения и загрузки изображения в это время.

3 голосов
/ 02 ноября 2011

Смена рамы изнутри drawRect ... не очень хорошая идея. Как вы себе представляете, что система изменяет размер чего-то, пока в данный момент рисует это?

Также загрузка изображения (медленная работа) изнутри drawRect (может вызываться часто) не очень хорошая идея. Вы должны загрузить изображение, когда вы получите имя файла и измените рамку просмотра в это время. И, возможно, с использованием некоторой анимации. Пользователь не будет ожидать, что представление изменит свой размер без анимации.

И

И нет, создание изображения до того, как я начну свой пользовательский просмотр, и добавление размеров в initWithFrame - не вариант.

Я не могу представить себе ситуацию, когда это не вариант. Это только о том, как вы разрабатываете свой код.

0 голосов
/ 02 ноября 2011

Нет, создание изображения до того, как я начну свой пользовательский просмотр, и добавление размеров в initWithFrame - не вариант.

Я не понимаю, почему это не таквариант, но ок.У вас есть недвижимость на ваш взгляд, self.imgName.Когда это установлено (у есть до изображения), вы должны получить изображение, определить его размер и установить рамку в этой точке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...