Добавьте увеличительное стекло над навигационным контроллером - PullRequest
2 голосов
/ 24 ноября 2011

Цель: получить 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 (вертикально), независимо от направления движения.Становиться намного ближе, хотя!

1 Ответ

1 голос
/ 04 декабря 2012

Разрешение

Вот оно:

CGPoint tPoint = [self convertPoint:point toView:[[[app navigationController] view] superview]];

Все, что мне нужно было сделать, это преобразовать CGPoint, созданный из события UITouch, в координатупространство супервизии контроллера навигации (частью которой является лупа).

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