Frage

würde Ich mag / Zum Vergrößern ein UIImage-Objekt aus, wenn der Benutzer die Standard-Klemmwirkung auf meine Anwendung führt. Ich bin derzeit ein UIImageView mit meinem Bild anzuzeigen, wenn das Detail in irgendeiner Weise hilft.

Ich versuche, herauszufinden, wie dies zu tun, aber kein Glück so weit.

Irgendwelche Hinweise?

War es hilfreich?

Lösung

Eine weitere einfache Möglichkeit, dies zu tun ist Ihr UIImageView innerhalb eines UIScrollView zu platzieren. Wie ich hier beschreiben, man müssen die Bildlaufansicht des content~~POS=TRUNC einstellen die gleiche wie Ihre UIImageView's Größe sein. Stellen Sie Ihren Controller-Instanz den Delegaten der Scroll-Ansicht zu sein und die viewForZoomingInScrollView: und scrollViewDidEndZooming:withView:atScale: Methoden implementieren für Pinch-Zoom und Bild Schwenken zu ermöglichen. Dies ist effektiv, was Ben-Lösung der Fall ist, nur in einer etwas leichteren Art und Weise, wie Sie nicht den Aufwand für eine vollständige Web-Ansicht haben.

Ein Problem, das Sie in ausführen können, ist, dass die Skalierung in der Scroll-Ansicht in Form von Transformationen auf das Bild angewandt kommt. Dies kann bei hohen Zoom-Faktoren zu Unschärfen führen. Für etwas, das neu gezeichnet werden können, können Sie meine Vorschläge folgen hier eine schärfere Anzeige nach der Pinch-Geste beendet ist vorzusehen. hniels' Lösung an diesem Punkt verwendet werden könnte, um das Bild neu zu skalieren.

Andere Tipps

Wie andere beschrieben, ist die einfachste Lösung, um Ihre UIImageView in eine UIScrollView zu setzen. Ich tat dies in der Interface Builder .xib Datei.

In viewDidLoad, stellen Sie die folgenden Variablen. Stellen Sie Ihren Controller ein UIScrollViewDelegate sein.

- (void)viewDidLoad {
    [super viewDidLoad];
    self.scrollView.minimumZoomScale = 0.5;
    self.scrollView.maximumZoomScale = 6.0;
    self.scrollView.contentSize = self.imageView.frame.size;
    self.scrollView.delegate = self;
}

Sie sind verpflichtet, die folgende Methode zu implementieren, um die Imageview Sie zoomen möchten zurückzukehren.

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
    return self.imageView;
}

In Versionen vor iOS9, können Sie auch diese leeren Delegatmethode hinzufügen müssen:

- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(CGFloat)scale
{
}

Die Apple-Dokumentation macht einen guten Job zu beschreiben wie dies zu tun:

Shefali Lösung für UIImageView funktioniert gut, aber es braucht eine wenig Änderung:

- (void)pinch:(UIPinchGestureRecognizer *)gesture {
    if (gesture.state == UIGestureRecognizerStateEnded
        || gesture.state == UIGestureRecognizerStateChanged) {
        NSLog(@"gesture.scale = %f", gesture.scale);

        CGFloat currentScale = self.frame.size.width / self.bounds.size.width;
        CGFloat newScale = currentScale * gesture.scale;

        if (newScale < MINIMUM_SCALE) {
            newScale = MINIMUM_SCALE;
        }
        if (newScale > MAXIMUM_SCALE) {
            newScale = MAXIMUM_SCALE;
        }

        CGAffineTransform transform = CGAffineTransformMakeScale(newScale, newScale);
        self.transform = transform;
        gesture.scale = 1;
    }
}

(Shefali Lösung hatte den Nachteil, dass sie nicht kontinuierlich skalierten, während kneifen. Wenn darüber hinaus eine neue Prise starten, die aktuelle Bild Skala zurückgesetzt wurde.)

Im Folgenden Code hilft UIImageView zu vergrößern, ohne UIScrollView mit:

-(void)HandlePinch:(UIPinchGestureRecognizer*)recognizer{
    if ([recognizer state] == UIGestureRecognizerStateEnded) {
        NSLog(@"======== Scale Applied ===========");
        if ([recognizer scale]<1.0f) {
            [recognizer setScale:1.0f];
        }
        CGAffineTransform transform = CGAffineTransformMakeScale([recognizer scale],  [recognizer scale]);
        imgView.transform = transform;
    }
}

Beachten Sie, dass Sie nie auf einem UIImage Zoomen. ÜBERHAUPT.

Stattdessen Sie Ein- und Auszoomen auf dem view, die die UIImage anzeigt.

In diesem speziellen Fall chould Sie wählen eine benutzerdefinierte UIView mit benutzerdefinierter Zeichnung erstellen um das Bild anzuzeigen, ein UIImageView, die das Bild zeigt für Sie, oder ein UIWebView, das einige zusätzliche HTML muss es wieder auf.

In allen Fällen müssen Sie touchesBegan, touchesMoved implementieren und dergleichen, um zu bestimmen, was der Benutzer versucht, zu tun (Zoom, Pan, usw.).

Hier ist eine Lösung, die ich verwendet habe, bevor, dass Sie nicht benötigen die UIWebView zu verwenden.

- (UIImage *)scaleAndRotateImage(UIImage *)image
{
    int kMaxResolution = 320; // Or whatever

    CGImageRef imgRef = image.CGImage;

    CGFloat width = CGImageGetWidth(imgRef);
    CGFloat height = CGImageGetHeight(imgRef);


    CGAffineTransform transform = CGAffineTransformIdentity;
    CGRect bounds = CGRectMake(0, 0, width, height);
    if (width > kMaxResolution || height > kMaxResolution) {
        CGFloat ratio = width/height;
        if (ratio > 1) {
            bounds.size.width = kMaxResolution;
            bounds.size.height = bounds.size.width / ratio;
        }
        else {
            bounds.size.height = kMaxResolution;
            bounds.size.width = bounds.size.height * ratio;
        }
    }

    CGFloat scaleRatio = bounds.size.width / width;
    CGSize imageSize = CGSizeMake(CGImageGetWidth(imgRef), CGImageGetHeight(imgRef));
    CGFloat boundHeight;
    UIImageOrientation orient = image.imageOrientation;
    switch(orient) {

        case UIImageOrientationUp: //EXIF = 1
            transform = CGAffineTransformIdentity;
            break;

        case UIImageOrientationUpMirrored: //EXIF = 2
            transform = CGAffineTransformMakeTranslation(imageSize.width, 0.0);
            transform = CGAffineTransformScale(transform, -1.0, 1.0);
            break;

        case UIImageOrientationDown: //EXIF = 3
            transform = CGAffineTransformMakeTranslation(imageSize.width, imageSize.height);
            transform = CGAffineTransformRotate(transform, M_PI);
            break;

        case UIImageOrientationDownMirrored: //EXIF = 4
            transform = CGAffineTransformMakeTranslation(0.0, imageSize.height);
            transform = CGAffineTransformScale(transform, 1.0, -1.0);
            break;

        case UIImageOrientationLeftMirrored: //EXIF = 5
            boundHeight = bounds.size.height;
            bounds.size.height = bounds.size.width;
            bounds.size.width = boundHeight;
            transform = CGAffineTransformMakeTranslation(imageSize.height, imageSize.width);
            transform = CGAffineTransformScale(transform, -1.0, 1.0);
            transform = CGAffineTransformRotate(transform, 3.0 * M_PI / 2.0);
            break;

        case UIImageOrientationLeft: //EXIF = 6
            boundHeight = bounds.size.height;
            bounds.size.height = bounds.size.width;
            bounds.size.width = boundHeight;
            transform = CGAffineTransformMakeTranslation(0.0, imageSize.width);
            transform = CGAffineTransformRotate(transform, 3.0 * M_PI / 2.0);
            break;

        case UIImageOrientationRightMirrored: //EXIF = 7
            boundHeight = bounds.size.height;
            bounds.size.height = bounds.size.width;
            bounds.size.width = boundHeight;
            transform = CGAffineTransformMakeScale(-1.0, 1.0);
            transform = CGAffineTransformRotate(transform, M_PI / 2.0);
            break;

        case UIImageOrientationRight: //EXIF = 8
            boundHeight = bounds.size.height;
            bounds.size.height = bounds.size.width;
            bounds.size.width = boundHeight;
            transform = CGAffineTransformMakeTranslation(imageSize.height, 0.0);
            transform = CGAffineTransformRotate(transform, M_PI / 2.0);
            break;

        default:
            [NSException raise:NSInternalInconsistencyException format:@"Invalid image orientation"];

    }

    UIGraphicsBeginImageContext(bounds.size);

    CGContextRef context = UIGraphicsGetCurrentContext();

    if (orient == UIImageOrientationRight || orient == UIImageOrientationLeft) {
        CGContextScaleCTM(context, -scaleRatio, scaleRatio);
        CGContextTranslateCTM(context, -height, 0);
    }
    else {
        CGContextScaleCTM(context, scaleRatio, -scaleRatio);
        CGContextTranslateCTM(context, 0, -height);
    }

    CGContextConcatCTM(context, transform);

    CGContextDrawImage(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, width, height), imgRef);
    UIImage *imageCopy = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return imageCopy;
}

Der Artikel kann auf Apple Support zu finden unter: http://discussions.apple.com/message.jspa?messageID=7276709# 7276709

Shafali und Antworten des JRV erweitert Panning und Prise enthalten vergrößern:

#define MINIMUM_SCALE 0.5
#define MAXIMUM_SCALE 6.0
@property CGPoint translation;


- (void)pan:(UIPanGestureRecognizer *)gesture {
    static CGPoint currentTranslation;
    static CGFloat currentScale = 0;
    if (gesture.state == UIGestureRecognizerStateBegan) {
        currentTranslation = _translation;
        currentScale = self.view.frame.size.width / self.view.bounds.size.width;
    }
    if (gesture.state == UIGestureRecognizerStateEnded || gesture.state == UIGestureRecognizerStateChanged) {

        CGPoint translation = [gesture translationInView:self.view];

        _translation.x = translation.x + currentTranslation.x;
        _translation.y = translation.y + currentTranslation.y;
        CGAffineTransform transform1 = CGAffineTransformMakeTranslation(_translation.x , _translation.y);
        CGAffineTransform transform2 = CGAffineTransformMakeScale(currentScale, currentScale);
        CGAffineTransform transform = CGAffineTransformConcat(transform1, transform2);
        self.view.transform = transform;
    }
}


- (void)pinch:(UIPinchGestureRecognizer *)gesture {
    if (gesture.state == UIGestureRecognizerStateEnded || gesture.state == UIGestureRecognizerStateChanged) {
//        NSLog(@"gesture.scale = %f", gesture.scale);

        CGFloat currentScale = self.view.frame.size.width / self.view.bounds.size.width;
        CGFloat newScale = currentScale * gesture.scale;

        if (newScale < MINIMUM_SCALE) {
            newScale = MINIMUM_SCALE;
        }
        if (newScale > MAXIMUM_SCALE) {
            newScale = MAXIMUM_SCALE;
        }

        CGAffineTransform transform1 = CGAffineTransformMakeTranslation(_translation.x, _translation.y);
        CGAffineTransform transform2 = CGAffineTransformMakeScale(newScale, newScale);
        CGAffineTransform transform = CGAffineTransformConcat(transform1, transform2);
        self.view.transform = transform;
        gesture.scale = 1;
    }
}

Der einfachste Weg, dies zu tun, wenn alles, was Sie wollen Prise Zoomen ist, ist Ihr Bild in einem UIWebView zu platzieren (schreibt kleine Menge von HTML-Wrapper-Code, Ihr Bild verweisen, und Sie sind im Grunde getan). Je mehr complcated Weg, dies zu tun, ist touchesBegan zu verwenden, touchesMoved und touchesEnded Spur von den Fingern des Benutzers zu halten, und stellen Sie verwandeln Ihre Ansicht Eigentum angemessen.

Beachten Sie, dass Sie nicht wollen, vergrößern / verkleinern UIImage. Stattdessen versuchen, die Ansicht zu vergrößern / verkleinern, die den UIImage-View-Controller enthält.

Ich habe eine Lösung für dieses Problem gemacht. Werfen Sie einen Blick auf mein Code:

@IBAction func scaleImage(sender: UIPinchGestureRecognizer) {
        self.view.transform = CGAffineTransformScale(self.view.transform, sender.scale, sender.scale)
        sender.scale = 1
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        view.backgroundColor = UIColor.blackColor()
    }

N. B .: Nicht vergessen, das PinchGestureRecognizer zu anschließen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top