iPhone UIImageView увеличить масштаб - PullRequest
4 голосов
/ 26 января 2010

Я пытался реализовать масштабирование с увеличением / уменьшением для PhotoView (экземпляр UIImageView) с использованием CGAffinTransformScale (планируя использовать вращение, поэтому не могу рассчитывать на кадры для масштабирования и добавлю подпредставления, чтобы UIScrollView был более сложным, я считать). Во всяком случае, концепцию было достаточно легко понять, и код собрался очень быстро ... С тех пор я пытался решить те же две (связанные ?!) проблемы, используя три разных подхода, и не смог этого сделать : 1- Мой код каким-то образом теряет счетчик касаний в середине увеличения, от count = 2 до count = 1 и обратно на iPhone, но не на симуляторе. 2. Точки касания 1 и 2 продолжают перемещаться вперед и назад на несколько пикселей при каждом движении, что приводит к последовательному и быстрому уменьшению и увеличению изображения, несмотря на то, что в целом эффект заключается в уменьшении или увеличении в соответствии с намерением пользователя (оба айфон и симулятор).

вот код:

#import "PhotoView.h"


@implementation PhotoView;
@synthesize originalCenter, distance, zooming;
- (id)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {
    // Initialization code
        self.userInteractionEnabled = YES;
        self.multipleTouchEnabled = YES;
        zooming = NO;
    }
    return self;
}

float distanceBetweenTwoPoints(CGPoint point1, CGPoint point2)
{
 NSLog(@"point1 x: %5.2f point 2 x: %5.2f ---- point 1 y: %5.2f  point 2 y:    %5.2f",point1.x,point2.x,point1.y,point2.y);
    return (sqrt(pow(point1.x -point2.x,2) + pow(point1.y - point2.y,2)));
}
-(void) touchesBegan: (NSSet *) touches withEvent:(UIEvent *) event {

    if ([touches count] > 1) {

      NSLog(@"^^^^^^^^^^^^^^^Tocuhes began with double touch!");

      distance = distanceBetweenTwoPoints([[[touches allObjects] objectAtIndex:0] locationInView:self], 
        [[[touches allObjects] objectAtIndex:1] locationInView:self]);
      zooming = YES;
    }
    else {
       zooming = NO;
       origianlCenter = [[[touches allObjects] objectAtIndex:0] locationInView:self];
       NSLog(@">>>>>>>>>>>>Touches began with single touch");
    }
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {

    if (zooming) NSLog(@"!!!!!!!!!end zoom!!!!!!!");

    zooming = NO;
    if ([[touches anyObject] tapCount] == 2) {
        UITouch *thisTouch = [touches anyObject];
        CGPoint thisPoint = [thisTouch locationInView:self];
    }
}

- (void) touchesMoved: (NSSet *) touches withEvent:(UIEvent *) event {
    if ([touches count] > 1 && zooming) { // ignore if user added a second finger touch
        float distanceNew = distanceBetweenTwoPoints([[[touches allObjects] objectAtIndex:0]     locationInView:self], 
                 [[[touches allObjects] objectAtIndex:1] locationInView:self]);  
        if (distance <= 0.f) {    // should never be true - but it is sometimes!!!
           distance = distanceNew;
        }  
        float delta = 1.0f + ((distanceNew-distance)/distance);
        self.transform = CGAffineTransformScale(self.transform, delta, delta);
        distance = distanceNew;
    }
    else {
       if (zooming) {
          NSLog(@"*************shouldn't be here********* %d",[touches count]);
          return;
       }
       CGPoint thisPoint = [[[touches allObjects] objectAtIndex:0] locationInView:self];
       self.transform = CGAffineTransformTranslate(self.transform, thisPoint.x-originalCenter.x, thisPoint.y-originalCenter.y);

    }
}
- (void)dealloc {
    [super dealloc];
}
@end

Пример журнала:

^^^^^^^^^^^^^^^Tocuhes began with double touch!
point1 x: 87.33 point 2 x: 235.63 ---- point 1 y: 322.30  point 2 y: 117.09
point1 x: 90.76 point 2 x: 232.02 ---- point 1 y: 318.29  point 2 y: 123.51
point1 x: 86.22 point 2 x: 236.71 ---- point 1 y: 323.30  point 2 y: 117.42
point1 x: 89.51 point 2 x: 232.38 ---- point 1 y: 319.47  point 2 y: 123.47
point1 x: 84.97 point 2 x: 237.02 ---- point 1 y: 324.48  point 2 y: 116.56
*************shouldn't be here********* 1
point1 x: 88.49 point 2 x: 232.52 ---- point 1 y: 321.27  point 2 y: 122.91
*************shouldn't be here********* 1
point1 x: 83.95 point 2 x: 237.11 ---- point 1 y: 327.21  point 2 y: 116.96
!!!!!!!!!end zoom!!!!!!!

Я начинаю подозревать, что теряю отслеживание точек касания из-за CGAffinTransformScale; Тем не менее, я не нашел ничего в Интернете, чтобы предположить, что это проблема. Будем благодарны за любые подсказки (включая «прочитайте документацию по xyz»!

Заранее спасибо.

Ответы [ 2 ]

17 голосов
/ 19 апреля 2010

Возможно, ответ из левого поля, но альтернативой может быть размещение UIImageView внутри UIScrollView, определение метода viewForZoomingInScrollView: в делегате с представлением прокрутки и установка свойств maximumZoomScale / minimumZoomScale, и вы У вас будет масштабирование без необходимости выполнять вычисления, чтобы установить преобразование самостоятельно? Я только что сделал это на недавнем проекте, и он работал хорошо.

6 голосов
/ 26 января 2010

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

Так что, если ваши прикосновения приводят к изменению преобразования View, вы должны сравнить касания с чем-то, что не изменяется - например, с вашим родительским представлением. Итак, вместо звонка:

[touch locationInView:self]

вы должны использовать

[touch locationInView:[self superview]]

Я не уверен, что это решит вашу проблему, но устранит одну возможную причину ваших проблем.

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