Поведение drawInRect с преобразованием вращения UIView - PullRequest
1 голос
/ 16 января 2012

У меня проблема с пониманием того, как параметр, передаваемый в метод drawInRect, определяется при выполнении преобразования вращения на UIView.

В качестве примера у меня есть UIView, который я повернул на угол 307степень.В методе drawInRect я регистрирую следующее: self.frame: {{103.932, 273.254}, {64.3007, 84.3374}} rect (переменная, передаваемая в качестве параметра: {{0, 0.102913}, {18, 89}}

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

Может кто-нибудь объяснить мне, как япредполагается использовать drawInRect в случае, если мой UIView повернут?


Чтобы дать более подробную информацию о моей проблеме, вот что я делаю:

У меня есть прокрутка с contentView внутри (Я добавляю свои UIViews в представлении содержимого.

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

Метод drawInRect UIView содержит следующее:

[_image drawInRect:CGRectMake(handlerSize.width, 0, _image.size.width, _image.size.height)];
CGSize size = CGSizeMake(kHandPickerWidth/self.scrollViewScale, kHandPickerHeight/self.scrollViewScale);
[_handPickerImage drawInRect:(0, _image.size.height, size.width, size.height)];

Объекты UIViews добавляются в viewWillAppear в представлении содержимого, выполняяследующее:

первый экземпляр,

, затем addSubview:

, затем я устанавливаю параметр scrollViewScale,

, затем я устанавливаю параметр кадра (в соответствии с верхнимотображается правое изображение (которое может изменяться)

, затем я поворачиваю UIView.

Начиная с третьей строки, код выполняется из

- (void)scrollViewDidZoom:(UIScrollView *)scrollView

, чтобы убедиться, что каждыйЕсли необходимо, переменная устанавливается правильно.

Линия, определяющая переменную размера, предназначена для регулировки размера маркера, независимо от значения zoomScale вида прокрутки.

Ответы [ 2 ]

1 голос
/ 24 января 2012

Итак, я нашел решение своей проблемы:

Я устанавливал параметр кадра несколько раз с определенным определением CGAffineTransformation, которое не должно выполняться.

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

Все работает так, как предполагалось.

1 голос
/ 16 января 2012

В основном вы просто рисуете, как обычно, и рисунок будет вращаться iOS для вас.Вы можете получить эту информацию о преобразовании, если хотите.

Вам нужно получить ссылку на контекст точной графики:

CGContextRef ctx = UIGraphicsGetCurrentContext();

Затем запросите матрицу преобразования напрямую:

CGAffineTransform tf = CGContextGetCTM(ctx);
NSLog(@"current ctm: %@",NSStringFromCGAffineTransform(tf));

или лучше, получите преобразование от вашей функции рисования к устройству:

CGAffineTransform tf = CGContextGetUserSpaceToDeviceSpaceTransform(ctx);
NSLog(@"user->device transform: %@",NSStringFromCGAffineTransform(tf));

И в drawRect: вы не должны слишком полагаться на переданный CGRect, потому что он служит в основномкак подсказка к тому, что часть представления нуждается в обновлении.(например, потому что вы назвали -setNeedsDisplayInRect:).Чтобы получить реальные границы, в которых живет ваш вид, используйте self.bounds.

Рисование за пределами CGRect не представляет реальной проблемы, но только немного ухудшит производительность.

edit ps.уточнить: self.frame - это рамка вашего представления в системе координат родительского представления.Он изменяется, если вы перемещаете, вращаете или иным образом трансформируете вид.self.bounds - это кадр вашего представления в его собственной системе координат, и (следовательно) остается постоянным при изменении положения или преобразований.

...