旋转变换后更改uiview大小

我的代码需要来自专业xcoders的一些帮助:-)

我有一个名为“headline”的可拖动的uitextview,它是“mainstage”中的一个子视图。 我还添加了一个捏手势来更改uitextview中的字体大小。 一切工作正常,但最后的基本function,我真的需要的是uitextview的旋转。

所以我添加了一个uislider旋转和volia! 它也有效。 但是在这个转换之后,当它通过捏手势变成一个新的大小时,uitextview会变得疯狂。 (* uitextview的位置和大小)

在文档的一些研究后,我发现“一些有用的警告”(框架):

如果要在框架矩形更改时调用drawRect:方法,请将contentMode属性设置为UIViewContentModeRedraw

很不错…但是我不知道要把它放在我的代码里

换句话说:如何改变旋转后的uiview的帧大小? (myview.transform)

感谢大家帮助这个…

这是我的代码:

- (void)viewDidLoad { // CREATE MAINSTAGE mainstage = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 768, 1024)]; mainstage.contentSize = CGSizeMake(self.view.frame.size.width, self.view.frame.size.height); mainstage.showsVerticalScrollIndicator=NO; mainstage.scrollEnabled=NO; mainstage.userInteractionEnabled=YES; mainstage.backgroundColor = [UIColor colorWithRed: 1.0 green: 1.0 blue: 1.0 alpha: 1.0]; mainstage.layer.masksToBounds = YES; [self.view addSubview:mainstage]; // CREATE HEADLINE headline = [[UITextView alloc]initWithFrame:CGRectMake(100, 100, 768, 1024)]; headline.text = @"Headline\nNo1"; headline.textColor = [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:1.0]; headline.textAlignment = NSTextAlignmentLeft; [headline setFont:[UIFont fontWithName:@"Helvetica" size:30]]; [headline setScrollEnabled:NO]; [headline setEditable:NO]; [headline setUserInteractionEnabled:YES]; [headline setBackgroundColor:[UIColor colorWithRed: 0.0 green: 0.0 blue: 0.0 alpha: 0.5]]; [headline sizeToFit]; // RESET [mainstage addSubview:headline]; // CREATE ROTATE SLIDER CGRect sliderFrameTextRotating = CGRectMake(0, 924, 768, 50); self.rotateSlider = [[UISlider alloc] initWithFrame:sliderFrameTextRotating]; self.rotateSlider.minimumValue = -100.0f; self.rotateSlider.maximumValue = 100.0f; self.rotateSlider.value = 0.0f; [self.rotateSlider setContinuous:true]; [self.rotateSlider addTarget:self action:@selector(getSliderRotatingValue:)forControlEvents:UIControlEventValueChanged]; [self.rotateSlider addTarget:self action:@selector(RotateSliderDidEndSliding:)forControlEvents:(UIControlEventTouchUpInside | UIControlEventTouchUpOutside)]; [mainstage addSubview:self.rotateSlider]; // GESTURES /* drag */ UIPanGestureRecognizer *TextdragRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(textviewDragged:)]; [headline addGestureRecognizer:TextdragRecognizer]; /* pinch */ UIPinchGestureRecognizer *twoFingerPinch = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(twoFingerPinch:)]; twoFingerPinch.cancelsTouchesInView = FALSE; twoFingerPinch.delaysTouchesEnded = TRUE; [headline addGestureRecognizer:twoFingerPinch]; [super viewDidLoad]; } // ROTATE - (IBAction)getSliderRotatingValue:(id)paramSender { headline.transform = CGAffineTransformMakeRotation(rotateSlider.value * 2*M_PI / rotateSlider.maximumValue); headline.contentMode = UIViewContentModeRedraw; // ? } // ROTATE SLIDER END - (void)RotateSliderDidEndSliding:(NSNotification *)notification { } // DRAG - (void)textviewDragged:(UIPanGestureRecognizer *)gestureRecognizer { UIView *piece = (UIView *)gestureRecognizer.view; if ([gestureRecognizer state] == UIGestureRecognizerStateBegan || [gestureRecognizer state] == UIGestureRecognizerStateChanged) { CGPoint translation = [gestureRecognizer translationInView:[piece superview]]; [piece setCenter:CGPointMake([piece center].x + translation.x, [piece center].y + translation.y)]; [gestureRecognizer setTranslation:CGPointZero inView:[piece superview]]; } else if ([gestureRecognizer state] == UIGestureRecognizerStateEnded) { } } // PINCH TEXT - (void) twoFingerPinch:(UIPinchGestureRecognizer *) recognizer { CGPoint touchPoint = [recognizer locationInView:mainstage]; UIView *touchView = [mainstage hitTest:touchPoint withEvent:nil]; // BEGAN if (recognizer.state == UIGestureRecognizerStatePossible || recognizer.state == UIGestureRecognizerStateBegan) { if([touchView isKindOfClass:[UITextView class]]) { touchView.tag = 1; UITextView *myViewWithTag = (UITextView *)[touchView viewWithTag:1]; myViewWithTag.backgroundColor = [UIColor colorWithRed: 0.0 green: 0.0 blue: 0.0 alpha: 0.5]; } } // CHANGED else if (recognizer.state == UIGestureRecognizerStateChanged) { UITextView *myViewWithTag = (UITextView *)[self.view viewWithTag:1]; touchView.backgroundColor = [UIColor colorWithRed: 0.0 green: 0.0 blue: 0.0 alpha: 0.5]; CGFloat scale = recognizer.scale; myViewWithTag.font = [UIFont fontWithName:myViewWithTag.font.fontName size:myViewWithTag.font.pointSize*scale]; [self textViewDidChange:myViewWithTag]; recognizer.scale = 1.0f; } // ENDED else if (recognizer.state == UIGestureRecognizerStateEnded) { UITextView *myViewWithTag = (UITextView *)[self.view viewWithTag:1]; touchView.backgroundColor = [UIColor colorWithRed: 0.0 green: 0.0 blue: 0.0 alpha: 0.5]; if (myViewWithTag.textAlignment == NSTextAlignmentLeft) { [touchView sizeToFit]; } } } // TEXTVIEW DID CHANGE - (void)textViewDidChange:(UITextView *)textView { UITextView *myViewWithTag = (UITextView *)[textView viewWithTag:1]; if (myViewWithTag.textAlignment == NSTextAlignmentLeft) { myViewWithTag.frame = CGRectMake(myViewWithTag.frame.origin.x, myViewWithTag.frame.origin.y, 768, 1024); // [myViewWithTag sizeToFit]; } } - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { // if the gesture recognizers are on different views, don't allow simultaneous recognition if (gestureRecognizer.view != otherGestureRecognizer.view) return NO; // if either of the gesture recognizers is the long press, don't allow simultaneous recognition if ([gestureRecognizer isKindOfClass:[UILongPressGestureRecognizer class]] || [otherGestureRecognizer isKindOfClass:[UILongPressGestureRecognizer class]]) return NO; return YES; } - (void)adjustAnchorPointForGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer { if (gestureRecognizer.state == UIGestureRecognizerStateBegan) { UIView *piece = gestureRecognizer.view; CGPoint locationInView = [gestureRecognizer locationInView:piece]; CGPoint locationInSuperview = [gestureRecognizer locationInView:piece.superview]; piece.layer.anchorPoint = CGPointMake(locationInView.x / piece.bounds.size.width, locationInView.y / piece.bounds.size.height); piece.center = locationInSuperview; } } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. }