我有一个只读的UITextView,我正在更新文本。 当新文本出现时,我希望它按照以下方式设置动画:新文本从右侧滑入,因为旧文本从屏幕左侧向左侧滑动。
是否可以使用transitionWithView执行此操作?如果没有,最好的方法是什么?我可以让它做一个CrossDissolve,但那不是我正在寻找的动画:
[UIView transitionWithView:self.storyTextView
duration:0.5
options:UIViewAnimationOptionTransitionCrossDissolve
animations:^{
[self.storyTextView setText:withStory.storyText];
}
completion:nil];
坚持右到左动画的原因是因为我最终希望用户能够通过向UITextView左侧滑动来触发它。
答案 0 :(得分:28)
CATransition
将允许您执行此操作,其过渡类型为' push'和来自右边的'的子类型。它非常简单易用:
CATransition *transition = [CATransition new];
transition.type = kCATransitionPush;
transition.subtype = kCATransitionFromRight;
// Make any view changes
self.textView.text = newText;
// Add the transition
[self.textView.layer addAnimation:transition forKey:@"transition"];
请注意,虽然这是您所要求的,但如果没有一些额外的修补,就不会很好地适应手势 - 将其与您需要的手势联系起来做一些事情,比如将图层速度设置为0并手动更新动画的进度以匹配您的手势。
答案 1 :(得分:1)
如何使用UIView animateWithDuration并将一个textView
向右滑动,同时从左侧滑动新的textView
。这是一个例子,只需要解决这些问题。如果这是你想要做的事,请告诉我。
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
self.textView2.frame = CGRectMake(1000.0,self.textView1.frame.origin.y,self.textView2.frame.size.width,self.textView2.frame.size.height);
}
- (IBAction)animate:(id)sender {
[UIView animateWithDuration:0.5 animations:^{
self.textView1.frame = CGRectMake(-200.0,self.textView1.frame.origin.y,self.textView1.frame.size.width,self.textView1.frame.size.height);
[UIView animateWithDuration:0.5 animations:^{
self.textView2.center = (CGPointMake(200, 200));
}];
}];
}
答案 2 :(得分:1)
您也可以尝试这样的事情。
您可以为文本视图创建一个containerView,然后使用UIView
动画更改坐标,使其从右向左滑动。
请参阅以下代码。
首先声明一个容器视图,然后将所需的文本视图作为其子视图。
在.h
@property (strong, nonatomic)IBOutlet UIView *containerView;
@property (strong, nonatomic)IBOutlet UITextView *childTextView; //I have set it as subview in xib
在.m中,请务必在viewDidLoad
或Xib中设置以下内容
self.containerView.clipsToBounds = YES;
手势
UISwipeGestureRecognizer *recog = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(changeText)];
recog.direction = UISwipeGestureRecognizerDirectionLeft;
[self.containerView addGestureRecognizer:recog];
美化(为此你需要QuartzCore / QuartzCore.h)
self.containerView.layer.borderWidth = 1.0f;
self.containerView.layer.borderColor = [UIColor lightGrayColor].CGColor;
self.containerView.layer.cornerRadius = 5.0f;
到点
- (void)changeText
{
[UIView animateWithDuration:0.3f animations:^(void){
CGRect endPos = self.childTextView.frame;
endPos.origin.x -= endPos.size.width; //Move it out of the view's frame to the left
self.childTextView.frame = endPos;
} completion:^(BOOL done){
CGRect startPos = self.childTextView.frame;
startPos.origin.x += (2*startPos.size.width);// this will take it to the right.
self.childTextView.frame = startPos;
self.childTextView.text = @"Changed text";
[UIView animateWithDuration:0.2f animations:^(void){
CGRect displayPos = self.childTextView.frame;
displayPos.origin.x -= displayPos.size.width; // To compensate for the double +ve on top
self.childTextView.frame = displayPos;
}];
}];
}