[IOS] extended uiimageviewex implementation: gesture movement, rotation, scaling (with a shrinking text tag function)

Source: Internet
Author: User

 

# Import <uikit/uikit. h> <br/> # import <quartzcore/quartzcore. h> </P> <p> typedef Enum {<br/> uiimageexnormal = 0, <br/> uiimageexfull <br/>} uiimageexstate; </P> <p> @ interface uiimageviewex: uiimageview <uigesturerecognizerdelegate> <br/>{< br/> uiview * parentview; // parent window, that is, use the uiview added by uiimageex </P> <p> bool ispanenable; // whether it can be moved <br/> bool ispinchenable; // whether the image can be zoomed in or out <br/> bool isrotateenable; // whether the image can be rotated <br/> bool ISTAP; // can you click </P> <p> uiimageexstate imagestate; // The current image status </P> <p> cgfloat imagescale; // maximum zoom factor <br/> cgfloat imagesize; // record the cumulative zoom of the image <br/> cgfloat imagerotation; // record the original image angle <br/> cgpoint imagepoint; // record the original position of the image </P> <p> uitextview * textview; // dynamically pop-up text </P> <p >}</P> <p> @ property (nonatomic, retain) uiview * parentview; <br/> @ property (nonatomic) cgfloat imagesize; <br/> @ property (nonatomic) cgfloat imagerotation; <br/> @ property (nonatomic) cgpoint imagepoint; </P> <p> @ property bool ispanenable; <br/> @ property bool isrotateenable; <br/> @ property bool ispinchenable; <br/> @ property bool ISTAP; </P> <p>-(void) handlepan :( uipangesturerecognizer *) recognizer; <br/>-(void) handlepinch :( uipinchgesturerecognizer *) recognizer; <br/>-(void) handlerotate :( uirotationgesturerecognizer *) recognizer; <br/>-(void) handletap :( uitapgesturerecognizer *) recognizer; </P> <p> // required <br/>-(void) setscaleandrotation :( uiview *) imageview; <br/>-(void) setinfotext :( nsstring *) string; <br/>-(void) setshadow :( bool) isshadow; <br/> @ end <br/>
# Import "uiimageviewex. H "</P> <p> @ implementation uiimageviewex <br/> @ synthesize parentview; <br/> @ synthesize isrotateenable, ispanenable, ispinchenable, ISTAP; <br/> @ synthesize imagesize, imagerotation, imagepoint; </P> <p>/* <br/> * setscaleandrotation: enables gesture rotation and scaling of imageview, and move <br/> * @ parent uiview parent window <br/> */<br/>-(void) setscaleandrotation :( uiview *) parent <br/>{< br/> parentview = parent; <br/> Paren Tview. userinteractionenabled = yes; </P> <p> ispanenable = yes; <br/> ispinchenable = yes; <br/> isrotateenable = yes; <br/> ISTAP = yes; </P> <p> imagesize = 1; <br/> imagerotation = 0; </P> <p> imagescale = self. parentview. frame. size. width/self. frame. size. width; <br/> imagepoint = self. frame. origin; <br/> self. userinteractionenabled = yes; </P> <p> uipangesturerecognizer * panrcognize = [[uipangesturerecognizer alloc] init Withtarget: Self action: @ selector (handlepan :)]; <br/> panrcognize. delegate = self; <br/> [panrcognize setenabled: Yes]; <br/> [panrcognize delaystouchesended]; <br/> [panrcognize cancelstouchesinview]; </P> <p> comment * pinchrcognize = [[comment alloc] initwithtarget: Self action: @ selector (handlepinch :)]; <br/> [pinchrcognize setenabled: Yes]; <br/> [pinchrcognize delaystou Chesended]; <br/> [pinchrcognize cancelstouchesinview]; </P> <p> using * rotationrecognize = [[using alloc] initwithtarget: Self action: @ selector (handlerotate :)]; <br/> [rotationrecognize setenabled: Yes]; <br/> [rotationrecognize delaystouchesended]; <br/> [rotationrecognize cancelstouchesinview]; <br/> rotationrecognize. delegate = self; <br/> pinchrcognize. dele Gate = self; </P> <p> uitapgesturerecognizer * taprecognize = [[using alloc] initwithtarget: Self action: @ selector (handletap :)]; <br/> taprecognize. numberoftapsrequired = 1; <br/> taprecognize. delegate = self; <br/> [taprecognize setenabled: Yes]; <br/> [taprecognize delaystouchesbegan]; <br/> [taprecognize cancelstouchesinview]; </P> <p> [self addgesturerecognizer: rotationrecognize]; <br/> [Self addgesturerecognizer: panrcognize]; <br/> [self addgesturerecognizer: pinchrcognize]; <br/> [self addgesturerecognizer: taprecognize]; </P> <p >}< br/>/* <br/> * setinfotext Setting Description text <br/> * @ string nsstring display text <br/> */ <br/>-(void) setinfotext :( nsstring *) string <br/>{< br/> If (textview! = Nil) {<br/> [textview removefromsuperview]; <br/> textview = nil; <br/>}</P> <p> textview = [[uitextview alloc] initwithframe: cgrectmake (0, 0, 0, 30)]; <br/> textview. TEXT = string; <br/> textview. hidden = yes; <br/> textview. backgroundcolor = [uicolor bluecolor]; <br/> textview. textcolor = [uicolor whitecolor]; <br/> [self addsubview: textview]; <br/>}< br/>/* <br/> * set whether to enable shadow. <br/> *@ Isshadow bool Yes enabled, no disabled <br/> */<br/>-(void) setshadow :( bool) isshadow <br/>{< br/> If (! Isshadow) {<br/> [[self layer] setshadowoffset: cgsizemake (0, 0)]; <br/> [[self layer] setshadowradius: 0]; <br/> [[self layer] setshadowopacity: 1]; <br/> [self layer] setshadowcolor: [uicolor whitecolor]. cgcolor]; <br/> return; <br/>}< br/> [[self layer] setshadowoffset: cgsizemake (3, 3)]; <br/> [[self layer] setshadowradius: 3]; <br/> [[self layer] setshadowopacity: 0.5]; <br/> [[self layer] setshad Owcolor: [uicolor blackcolor]. cgcolor]; <br/>}</P> <p> # pragma uigesturerecognizer handles <br/>/* <br/> * function of mobile image processing <br/> * @ recognizer mobile gesture <br/> */<br/>-(void) handlepan :( uipangesturerecognizer *) recognizer {</P> <p> If (! Ispanenable) {<br/> return; <br/>}< br/> [self setshadow: Yes]; <br/> cgpoint translation = [recognizer translationinview: parentview]; <br/> recognizer. view. center = cgpointmake (recognizer. view. center. X + translation. x, <br/> recognizer. view. center. Y + translation. y); <br/> [recognizer settranslation: cgpointmake (0, 0) inview: parentview]; </P> <p> If (recognizer. state = uigesturerecognizerstateended) {<Br/> [uiview animatewithduration: 0.75 delay: 0 options: uiviewanimationoptioncurveeaseout animations: ^ {<br/> recognizer. view. center = cgpointmake (imagepoint. X + self. frame. size. width/2, imagepoint. Y + self. frame. size. height/2); <br/>}completion: Nil]; </P> <p> [self setshadow: No]; </P> <p >}< br/>/* <br/> * handpinch scaling function <br/> * @ recognizer uipinchgesturerecognizer gesture identification Tool <br/> */<br/>-(void) Handlepinch :( uipinchgesturerecognizer *) recognizer {<br/> If (! Ispinchenable) {<br/> return; <br/>}< br/> imagesize * = recognizer. scale; <br/> recognizer. view. transform = cgaffinetransformscale (recognizer. view. transform, recognizer. scale, recognizer. scale); <br/> If (recognizer. state = uigesturerecognizerstateended) {</P> <p> [uiview animatewithduration :. 35 animations: ^ {<br/> If (imagesize> = 1 & imagestate = uiimageexnormal) {<br/> recognizer. view. transform = Cgaffinetransformscale (recognizer. view. transform, imagescale/imagesize, imagescale/imagesize); <br/> imagestate = uiimageexfull; <br/>}< br/> else if (imagesize <1 & imagestate = uiimageexfull) <br/>{< br/> recognizer. view. transform = cgaffinetransformscale (recognizer. view. transform, 1/(imagescale * imagesize), 1/(imagescale * imagesize); <br/> imagestate = uiimageexnormal; <br/>} else {<br/> rec Ognizer. view. transform = cgaffinetransformscale (recognizer. view. transform, 1/imagesize, 1/imagesize); <br/>}</P> <p> [uiview animatewithduration: 0.35 delay: 0 options: uiviewanimationoptioncurveeaseout animations: ^ {<br/> recognizer. view. center = cgpointmake (imagepoint. X + self. frame. size. width/2, imagepoint. Y + self. frame. size. height/2); <br/>}completion: Nil]; <br/> recognizer. scale = 1; <br/> imagesize = 1; <br/>}]; </P> <p >}< br/> recognizer. scale = 1; </P> <p >}</P> <p>/* <br/> * handlerotate rotation function <br/> * recognizer uirotationgesturerecognizer <br/> */ <br/>-(void) handlerotate :( uirotationgesturerecognizer *) recognizer {<br/> If (! Isrotateenable) {<br/> return; <br/>}< br/> imagerotation + = recognizer. rotation; <br/> recognizer. view. transform = cgaffinetransformrotate (recognizer. view. transform, recognizer. rotation); <br/> If (recognizer. state = uigesturerecognizerstateended) {<br/> [uiview animatewithduration :. 35 animations: ^ {<br/> recognizer. view. transform = cgaffinetransformrotate (recognizer. view. transform,-imagerotation ); <Br/> recognizer. view. center = cgpointmake (imagepoint. X + self. frame. size. width/2, imagepoint. Y + self. frame. size. height/2); <br/>}]; </P> <p> imagerotation = 0; <br/>}< br/> recognizer. rotation = 0; <br/>}</P> <p>/* <br/> * handletap touch function <br/> * @ recognizer uitapgesturerecognizer touch reader <br/> */<br />-(void) handletap :( uitapgesturerecognizer *) recognizer <br/>{< br/> If (! ISTAP) {<br/> return; <br/>}< br/> If (textview. hidden) {<br/> [uiview animatewithduration: 0.35 delay: 0.15 options: uiviewanimationoptiontransitioncurlup animations: ^ {<br/> textview. hidden = no; <br/> textview. frame = cgrectmake (0, 0,120, 30); <br/>}completion: Nil]; <br/>}else {<br/> [uiview animatewithduration: 0.35 delay: 0.15 options: uiviewanimationoptiontransitioncurlup animations: ^ {</P> <p> textview. frame = cgrectmake (0, 0, 0, 30); <br/>} completion: ^ (bool finished) {<br/> If (finished) {<br/> textview. hidden = yes; <br/>}< br/>}]; <br/>}</P> <p> # pragma uigesturerecognizerdelegate <br/>/* <br/> * gesturerecognizer implements delegation, therefore, multiple gestures can be accepted simultaneously <br/> * @ return YES, no, you can only accept one gesture <br/> */<br/>-(bool) gesturerecognizer :( uigesturerecognizer *) gesturerecognizer runner :( uigesturerecognizer *) othergesturerecognizer {<br/> return yes; <br/>}</P> <p> @ end <br/>

Related Article

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.