যখন ব্যবহারকারী স্ক্রিনটি পিন করে কোনও ইউআইআইমেজ অবজেক্টটিকে জুম / আউট করবেন কীভাবে?


84

ব্যবহারকারী যখন আমার অ্যাপ্লিকেশনটিতে স্ট্যান্ডার্ড চিমটি ক্রিয়া সম্পাদন করে তখন আমি কোনও ইউআইআইমেজ অবজেক্টটি জুম / আউট করতে চাই। আমি বর্তমানে আমার চিত্রটি প্রদর্শনের জন্য একটি ইউআইআইমেজভিউ ব্যবহার করছি, যদি সেই বিবরণটি কোনওভাবে সহায়তা করে।

আমি কীভাবে এটি করব তা বোঝার চেষ্টা করছি তবে এখন পর্যন্ত এরকম কোনও ভাগ্য নেই।

কোন সংকেত সনাক্ত করুন?

উত্তর:


85

এটির আর একটি সহজ উপায় হ'ল আপনার UIImageViewএকটি এর মধ্যে স্থাপন করা UIScrollViewআমি এখানে বর্ণনা হিসাবে, আপনার UIImageView'sআকার হিসাবে একই হতে আপনার স্ক্রোল ভিউ এর কন্টেন্টসাইজ সেট করতে হবে । আপনার নিয়ামক উদাহরণটি স্ক্রোল দর্শনের প্রতিনিধি হিসাবে সেট করুন viewForZoomingInScrollView:এবং scrollViewDidEndZooming:withView:atScale:চিমটি-জুমিং এবং চিত্র প্যানিংয়ের জন্য অনুমতি দেওয়ার জন্য এবং পদ্ধতিগুলি প্রয়োগ করুন । এটি কার্যকরভাবে বেনের সমাধান যা কেবলমাত্র কিছুটা বেশি হালকা ওজনের সাথে করে, কারণ আপনার কাছে একটি সম্পূর্ণ ওয়েব দৃশ্যের ওভারহেড নেই।

আপনি যে সমস্যার সমাধান করতে পারেন তা হ'ল স্ক্রোল ভিউয়ের মধ্যে থাকা স্কেলিংটি চিত্রটিতে প্রয়োগিত রূপান্তর আকারে আসে। এটি উচ্চ জুমের কারণে ঝাপসা হতে পারে। পুনরায় চিত্রিত করা যায় এমন কোনও কিছুর জন্য, চিমটি অঙ্গভঙ্গিটি শেষ হওয়ার পরে আপনি একটি খাঁটি প্রদর্শন প্রদান করতে আমার পরামর্শগুলি এখানে অনুসরণ করতে পারেন । আপনার চিত্রটি পুনরুদ্ধার করতে এই মুহুর্তে হ্নিয়েলসের সমাধান ব্যবহার করা যেতে পারে।


4
আপনি সর্বাধিক জুমস্কেল এবং / অথবা সর্বনিম্ন জুমস্কেল :) পরিবর্তন করেছেন তা নিশ্চিত করুন।
ক্রিস প্রিন্স

94

অন্যরা বর্ণিত হিসাবে, সবচেয়ে সহজ সমাধানটি হল আপনার ইউআইআইমেজভিউকে একটি ইউআইএসক্রোলভিউতে রাখা। আমি ইন্টারফেস বিল্ডার .xib ফাইলে এটি করেছি।

ViewDidLoad এ, নিম্নলিখিত ভেরিয়েবলগুলি সেট করুন। আপনার নিয়ামককে একটি ইউআইএসক্রোলভিউডেলিগেট হিসাবে সেট করুন।

- (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;
}

আপনি যে চিত্রটি জুম করতে চান তা ফিরিয়ে দিতে আপনাকে নিম্নলিখিত পদ্ধতিটি প্রয়োগ করতে হবে।

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

আইওএস 9 এর পূর্ববর্তী সংস্করণগুলিতে আপনার এই খালি প্রতিনিধি পদ্ধতিটি যুক্ত করতে হতে পারে:

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

অ্যাপল ডকুমেন্টেশন এই কিভাবে করতে হবে বর্ণনাকারী একটি ভাল পেশা আছে:


4
স্ক্রোলভিউডিডএন্ডজুডিং মুছে ফেলা ঠিক আছে: ভিউয়ের সাথে: এখন, আমি আইওএস 9 এক্সকোড 7
এলনচান

4
এটা আমার জন্য কাজ করে! scrollViewDidEndZooming :পদ্ধতি বাস্তবায়ন ছাড়াই ।
জনি ঝাং

48

ইউআইআইমেজভিউয়ের জন্য শেফালির সমাধানটি দুর্দান্ত কাজ করে তবে এর জন্য কিছুটা পরিবর্তন দরকার:

- (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;
    }
}

(শেফালির সমাধানটি এমন খারাপ দিক ছিল যা চিমটি দেওয়ার সময় অবিচ্ছিন্নভাবে মাপেনি Furthermore তদুপরি, একটি নতুন চিম্টি শুরু করার সাথে সাথে বর্তমান চিত্র স্কেলটি পুনরায় সেট করা হয়েছিল))


আমি চিমটি অঙ্গভঙ্গি শুরু হওয়ার পরে প্যান অঙ্গভঙ্গি সক্ষম করতে চাই that কীভাবে এটি করা যায়?
গজেন্দ্র কে চৌহান

@ গজেন্দ্র: সেক্ষেত্রে, আমার মনে হয় আপনার নিজের উপাদানগুলি একটি স্ক্রোল ভিউতে এম্বেড করা উচিত, যা বাক্সের বাইরে উভয়কেই সমর্থন করে
জেআরভি

তবে আমি ট্যাপ ইশারা এবং চিমটি ইশারা উভয়ের জন্য কার্যকারিতা চাই। আমি ইমেজভিউতে গ্রিড (স্তর )ও ব্যবহার করেছি। আমি কি জানতে পারি, স্ক্রোল ভিউতে চিমটি অঙ্গভঙ্গি এবং আলিঙ্গনটি ট্যাপ করা কি সম্ভব?
গজেন্দ্র কে চৌহান

@ গজেন্দ্রকেচৌহান: একটি স্ক্রোল ভিউ বাক্সটি জুম করতে এবং প্যান করার জন্য চিমটি সমর্থন করে - কেবল সর্বনিম্ন / সর্বাধিক জুম স্কেল সেট করা মনে রাখবেন, তবে ব্র্যাড লারসনের উত্তরটিও দেখুন। এবং যদি আপনি পাশাপাশি টোকা অঙ্গভঙ্গি চান, আপনি এটি একটি অঙ্গভঙ্গি হিসাবে যুক্ত করতে পারেন।
জেআরভি

@ জেআরভি, স্ব.ফ্রেম.সাইজ.উইদথকে স্বীকৃতি দেওয়ার জন্য আমার কী প্রতিনিধিদের যুক্ত করা দরকার?

23

নীচের কোডটি ইউআইএসক্রোলভিউ ব্যবহার না করেই ইউআইআইমেজভিউ জুম করতে সহায়তা করে:

-(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;
    }
}

এটি সর্বোচ্চ সমাধান :)। ধন্যবাদ.
সাবিল্যান্ড

19

মনে রাখবেন যে আপনি কখনই জুম করে আসছেন না UIImage। কখনও।

পরিবর্তে, আপনি viewপ্রদর্শন করে যে জুম ইন এবং আউট আউট UIImage

এই বিশেষ ক্ষেত্রে, আপনি চিত্রটি UIViewপ্রদর্শনের জন্য কাস্টম অঙ্কন সহ একটি কাস্টম তৈরি করতে পছন্দ করেছেন, UIImageViewএটি আপনার জন্য চিত্রটি প্রদর্শন করে বা UIWebViewএটির ব্যাক আপ করার জন্য কিছু অতিরিক্ত এইচটিএমএল প্রয়োজন হবে।

সব ক্ষেত্রে, আপনি বাস্তবায়ন করতে হবে touchesBegan, touchesMovedএবং অন্য কোনো কোনটি ব্যবহারকারী করতে (জুম, প্যান, ইত্যাদি) চেষ্টা করছে।


স্পষ্টকরণের জন্য +1, কখনই সেভাবে ভাবেননি, বোকা চিয়ার্স
এলমো

@ অগাস্ট, আপনি কি আমাকে কোনও উদাহরণ প্রদান করতে পারেন যা টাচবেগান, স্পর্শমোভেডে চিত্রটি জুম এবং ঘোরান?
মিতেশ ডোবারিয়া

7

এটির আগে আমি একটি সমাধান ব্যবহার করেছি যার জন্য ইউআইবিউব ভিউ ব্যবহার করার প্রয়োজন নেই।

- (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;
}

অ্যাপল সাপোর্টে নিবন্ধটি পাওয়া যাবে এখানে: http://discussion.apple.com/message.jspa?messageID=7276709#7276709


-1 একটি জেএসপি হোস্ট করা সমর্থন পৃষ্ঠার জন্য। ডট সিনট্যাক্সে
মুঠির কাঁপুন

আপনি কি আমাকে এই পদ্ধতিটি (মাউস সরানো বা স্পর্শে) কল করতে পারেন দয়া করে?
ভুমেশ পুরোহিত

5

শাফালি এবং জেআরভির উত্তরগুলি জুমে প্যানিং এবং চিমটি অন্তর্ভুক্ত করতে প্রসারিত:

#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;
    }
}

দয়া করে অন্যের উত্তর উল্লেখ করা এড়িয়ে যান কারণ তারা যে কোনও সময় তাদের উত্তর সরাতে পারে।
এনামুল হাসান

3

এটি করার সহজ উপায়টি, যদি আপনি চাইলে চিমটি জুম করা হয় তবে হ'ল আপনার চিত্রটি একটি ভিতরে রেখে দিন UIWebView(এইচটিএমএল র‍্যাপার কোডের একটি ছোট পরিমাণ লিখুন, আপনার চিত্রটি উল্লেখ করুন এবং আপনি মূলত সম্পন্ন করেছেন)। এই কাজ করতে আরো complcated পথ ব্যবহার করা touchesBegan, touchesMovedএবং touchesEndedব্যবহারকারীর আঙ্গুলের ট্র্যাক রাখতে, এবং সামঞ্জস্য আপনার ভিউ সম্পত্তি উপযুক্তভাবে রুপান্তর।


আপনি কি আমাকে আপনার উত্তর সম্পর্কিত কোনও উদাহরণ বলতে পারেন? টাচবেগান, টাচমোভড পদ্ধতি ব্যবহার করে আমি কীভাবে চিত্রটি জুম এবং ঘোরান। আমার প্রশ্ন লিংক => stackoverflow.com/questions/36833841/...
Mitesh Dobareeya

0

মনে রাখবেন আপনি ইউআইআইমেজ জুম / আউট করতে চান না। পরিবর্তে ইউআইআইমেজ ভিউ কন্ট্রোলারযুক্ত ভিউতে জুম / আউট করার চেষ্টা করুন।

আমি এই সমস্যার সমাধান করেছি made আমার কোডটি একবার দেখুন:

@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()
    }

এনবি: পিঞ্চগেষ্টারর সনাক্তকারীকে ভুলতে ভুলবেন না।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.