iPhone – Как создать прямоугольник изменяемого размера для обрезки изображений?
-
21-09-2019 - |
Вопрос
У меня возникли проблемы с созданием прямоугольника изменяемого размера для обрезки изображений.Я пытаюсь добиться чего-то вроде этой картинки:
http://img192.imageshack.us/img192/8930/customcropbox.jpg
Ну, единственная проблема в том, что я понятия не имею, с чего начать.Мне нужен совет, как добиться такого эффекта обрезки.Какую документацию мне следует прочитать?Базовая графика или Quartz 2d?Оба?Я писал код для iPhone с момента его выпуска, но никогда не использовал основную графику и т. д.Любая помощь или совет будут очень признательны.По мере продвижения я буду выкладывать сюда свой код, чтобы показать, как это делается, когда я этого достигаю.:-) Кроме того, этот прямоугольный блок можно перемещать по экрану в UIImageView, что делает его еще более интересным.Спасибо за помощь, и я с нетерпением жду достижения этой цели.
Решение
добавить в закладки мой вопрос что в точности то же самое.
Мне удалось переместить вид обрезки и заставить его правильно отображать часть изображения, но работа с масштабированием режима прокрутки находится в стадии разработки.в настоящее время у меня есть изображение и простой UIView, наложенные на UIScrollview, затем за пределами прокрутки и на более высоком уровне находится мой собственный UIView для обрезки.Я реализую методы touch, чтобы справиться с перетаскиванием, а также drawRect:
- (void)drawRect:(CGRect)rect {
// Drawing code
if( self.image == nil )
return;
CGPoint offset = scrollView.contentOffset;
clipRect = CGRectOffset(self.frame, offset.x, offset.y);
UIImage *croppedImage = [image croppedImage:clipRect];
CGContextRef ctx = UIGraphicsGetCurrentContext();
[croppedImage drawAtPoint:CGPointMake(0, 0)];
}
Примечание:мое представление обрезки НЕ является потомком UIImageView, это просто UIView со ссылкой на базовое изображение из другого представления.
«croppedImage» — это категория в UIImage, и она довольно проста:
@implementation UIImage (Resize)
- (UIImage *)croppedImage:(CGRect)bounds {
CGImageRef imageRef = CGImageCreateWithImageInRect([self CGImage], bounds);
UIImage *croppedImage = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);
return croppedImage;
}
...
@end
Я реализовал несколько методов UIScrollViewDelegate и пропустил действия прокрутки, чтобы иметь возможность синхронизировать представление обрезки.Масштабирование тоже передается, но, как уже упоминалось, пока не работает должным образом.
Еще одно примечание:Я не думаю, что необходимо каждый раз тратить время на создание нового UIImage с обрезанной областью, поскольку то же самое должно быть возможно с
CGImageRef imageRef = CGImageCreateWithImageInRect([yourImage CGImage], bounds);
and
CGContextDrawImage(ctx, clipRect, imageRef);
Другие советы
Кварц — это «маркетинговый термин» для Core Graphics, и именно с него вам следует начать.Вам понадобится использовать UIView (полностью настраиваемый рисунок в -drawRect:), перехватывать и отслеживать его касания, а затем рисовать результат.Вы можете получить текущий графический контекст, используя UIGraphicsGetCurrentContext().Этого должно быть достаточно, чтобы начать!