Цель: получить UIView, маленькое увеличительное стекло, для размещения над навигационным контроллером.Это похоже на лупу в программе Notes.
Я частично выполнил эту задачу с помощью следующего кода:
MyAppDelegate *app = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];
[[[[app navigationController] view] superview] addSubview:_loupe];
Это позволяет отображать лупу над контроллером навигации.Примечание: переменная _loupe содержит экземпляр UIView, который увеличит представление.
Этот код отлично работает в режиме Portrait.Однако, когда я изменяю ориентацию на альбомную, координаты _loupe по-прежнему находятся в портретном режиме.
Через много проб и ошибок и многочасовых ударов головой я понял, что UINavigationController, который добавляется какrootViewController приложения никогда не обновляет свои координаты при изменении ориентации.У всех других представлений, включая RootViewController (класс по умолчанию, созданный при создании нового приложения в XCode), обновлены их координаты.
Я попытался исправить это путем создания подкласса UINavigationController с моим собственным контроллером, чтобы сделать его так должен: вызывается навигационным контроллером вместо RootViewController.Я надеялся, что причина, по которой он не вращался, заключается в том, что это не контроллер, запрашивающий ориентацию.Ничего.
Я также повернул представление _loupe следующим образом:
CGAffineTransform transform = _loupe.transform;
transform = CGAffineTransformMakeRotation([self degreesToRadians:90.0]);
_loupe.transform = transform;
_loupe.bounds = CGRectMake(0, 0, 480, 320);
_loupe.frame = CGRectMake(0, 0, 80, 80);
Это делает UIView под касанием увеличенной правой стороной вверх.Первоначально UIView снизу был повернут на -90 при изменении ориентации влево.Так что я почти там ... но координаты все еще облажались.
Я также пытался изменить _loupe.bounds на CGRectMake (0, 480, 480, 320), полагая, что изменение источника можетсоответствовать базовой системе координат.Никаких кубиков.
Моим последним средством было преобразование реальных точек x / y UITouch.
CGPoint point = [touch locationInView:self];
CGAffineTransform transform = CGAffineTransformRotate([_loupe transform], [self degreesToRadians:90.0]);
CGPoint tPoint = CGPointApplyAffineTransform(point, transform);
Без кубиков.Тем не менее, это делает лупу отображаемой вблизи видимой области.Я обнаружил, что перемещение касания по оси x перемещает лупу по оси y, а перемещение касания по оси y перемещает лупу по оси x.Так что теперь он полностью перевернут.
Короче, я просто хочу простой способ отобразить увеличительное стекло над навигационным контроллером без всего этого.
Редактировать
Я немного приблизился, преобразовав точку в вид лупы.
CGPoint tPoint = [self convertPoint:point toView:_loupe];
Это заставляет лупу сильно мерцать ... она также перемещает лупу как на x, так и наОсь Y (вертикально), независимо от направления движения.Становиться намного ближе, хотя!