#objective-c #xcode
#objective-c #xcode
Вопрос:
то, что я хочу, это показать изображение в режиме просмотра изображений и затемнить изображение через 5 секунд и показать следующее изображение. изображения хранятся в массиве объектов … я смог выполнить успешный переход между изображениями через 5 секунд.я хочу, чтобы первое изображение исчезло через 5 секунд и появилось следующее, это должно произойти в бесконечном цикле … ниже приведен код, и он действительно хорошо работает для нормального перехода между изображениями..то, что я хочу, — это исчезновение изображений…и должны были добавить переход к затуханию в приведенном ниже коде
- (void)viewDidLoad {
imgView.animationImages=[NSArray arrayWithObjects:
[UIImage imageNamed:@"lori.png"],
[UIImage imageNamed:@"miranda.png"],
[UIImage imageNamed:@"taylor.png"],
[UIImage imageNamed:@"ingrid.png"],
[UIImage imageNamed:@"kasey.png"],
[UIImage imageNamed:@"wreckers.png"], nil];
imgView.animationDuration=20.0;
imgView.animationRepeatCount=0;
[imgView startAnimating];
[self.view addSubview:imgView];
[imgView release];
[super viewDidLoad];
}
Ответ №1:
Вы можете использовать повторяющийся NSTimer для вызова специального метода, который непрерывно анимирует свойство image views alpha с 0.0 до 1.0. Вот некоторый код, который я написал, который работает:
- (void)viewDidLoad {
imgView.animationImages=[NSArray arrayWithObjects:
[UIImage imageNamed:@"lori.png"],
[UIImage imageNamed:@"miranda.png"],
[UIImage imageNamed:@"taylor.png"],
[UIImage imageNamed:@"ingrid.png"],
[UIImage imageNamed:@"kasey.png"],
[UIImage imageNamed:@"wreckers.png"], nil];
imgView.animationDuration=20.0;
imgView.animationRepeatCount=0;
[imgView startAnimating];
[self.view addSubview:imgView];
[imgView release];
//The timers time interval is the imageViews animation duration devided by the number of images in the animationImages array. 20/5 = 4
NSTimer *timer = [NSTimer timerWithTimeInterval:4.0
target:self
selector:@selector(onTimer)
userInfo:nil
repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
[timer fire];
[super viewDidLoad];
}
//It is important that the animation durations within these animation blocks add up to 4
//(the time interval of the timer). If you change the time interval then the time intervals
//in these blocks must also be changed to refelect the amount of time an image is displayed.
//Failing to do this will mean your fading animation will go out of phase with the switching of images.
-(void)onTimer{
[UIView animateWithDuration:3.0 animations:^{
imgView.alpha = 0.0;
}];
[UIView animateWithDuration:1.0 animations:^{
imgView.alpha = 1.0;
}];
}
Если вы хотите, чтобы длительность затухания составляла 5 секунд вместо 4, вам нужно увеличить свойство animationDuration для просмотра изображений до 25, а затем увеличить длительность анимации затухания в двух блоках таким образом, чтобы суммарное время затухания = 5.
Комментарии:
1. обе анимации запустились бы немедленно и одновременно, не так ли? вам лучше использовать animateWithDuration:animations:completion: где вторая анимация запускается по завершении первой анимации. И я устанавливаю длительность анимации так, чтобы она соответствовала длительности изображений, изменяющихся в imageview. Или измените изображения вручную в методе OnTimer, что лучше, если оно все равно анимируется из кода.
2. @saman: я попробовал приведенный выше код, и мне удалось получить эффект затухания. я хочу, чтобы первое изображение исчезло и показало следующее, а второе исчезающее — следующее …. и т.д. то, что я получаю, — это исчезновение первого изображения, внезапный переход второго, а затем второе изображение, исчезающее через определенную миллисекунду, все еще показывающее второе изображение, и внезапный переход третьего … пожалуйста, вы мне поможете
3. Вы имеете в виду, что по мере того, как текущее изображение исчезает, вы хотите, чтобы следующее изображение исчезало? Чтобы изображение не стало белым, оно переходит непосредственно в следующее изображение?
4. да …. то, что я получаю, это то, что первое изображение исчезает .. внезапно появляется следующее изображение.. второе изображение становится белым и показывает третье через 2 миллисекунды
5. Вам нужны два вида изображений, одно поверх другого, чтобы при исчезновении самого верхнего вида изображения отображался вид изображения на слое ниже.
Ответ №2:
@user652878 Это отвечает на ваш вопрос относительно незаметного перехода от одного изображения к следующему:
Создайте следующие свойства в заголовке вашего view controllers:
UIImageView *imageViewBottom, *imageViewTop;
NSArray *imageArray;
Затем добавьте этот код в свой файл implimentaion:
int topIndex = 0, prevTopIndex = 1;
- (void)viewDidLoad {
imageViewBottom = [[UIImageView alloc] initWithFrame:CGRectMake(0,0,320,480)];
[self.view addSubview:imageViewBottom];
imageViewTop = [[UIImageView alloc] initWithFrame:CGRectMake(0,0,320,480)];
[self.view addSubview:imageViewTop];
imageArray = [NSArray arrayWithObjects:
[UIImage imageNamed:@"lori.png"],
[UIImage imageNamed:@"miranda.png"],
[UIImage imageNamed:@"taylor.png"],
[UIImage imageNamed:@"ingrid.png"],
[UIImage imageNamed:@"kasey.png"],
[UIImage imageNamed:@"wreckers.png"], nil];
NSTimer *timer = [NSTimer timerWithTimeInterval:5.0
target:self
selector:@selector(onTimer)
userInfo:nil
repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
[timer fire];
[super viewDidLoad];
}
-(void)onTimer{
if(topIndex %2 == 0){
[UIView animateWithDuration:5.0 animations:^
{
imageViewTop.alpha = 0.0;
}];
imageViewTop.image = [imageArray objectAtIndex:prevTopIndex];
imageViewBottom.image = [imageArray objectAtIndex:topIndex];
}else{
[UIView animateWithDuration:5.0 animations:^
{
imageViewTop.alpha = 1.0;
}];
imageViewTop.image = [imageArray objectAtIndex:topIndex];
imageViewBottom.image = [imageArray objectAtIndex:prevTopIndex];
}
prevTopIndex = topIndex;
if(topIndex == [imageArray count]-1){
topIndex = 0;
}else{
topIndex ;
}
}
Комментарии:
1. @samanB: чувак, снимаю шляпу .. сработало отлично … но дело в том, что после третьего изображения приложение завершает работу .. надеюсь, ты поможешь мне в этом
2. Не могли бы вы, пожалуйста, вставить стек вызовов и ошибку, которую вы получаете при сбое. Без этого я почти ничего не могу сделать, чтобы помочь вам.
3. samanB: в консоли произошла ошибка или сбой. просто он показывает 3 изображения идеально, а затем завершает работу
4. У вас нет ошибки в консоли? У меня этот код работает нормально, убедитесь, что все имена файлов изображений указаны правильно, если у вас ошибка в строке, это приведет к сбою программы. Проверьте 4-е изображение в массиве, поскольку оно показывает, что первые 3 в порядке.
5. @saman: чувак, давно не виделись … я попробовал приведенный выше код для 3 изображений, приложение вылетает, выдавая ошибку в консоли, что NSInvalidArgumentException-[NSCFString objectAtIndex:]: Нераспознанный селектор отправлен в экземпляр 0x5e .. прошу тебя помочь мне.
Ответ №3:
Вот что сработало у меня, когда я хотел анимировать набор сообщений в виде изображений для пользователя. Независимо от того, сколько у вас изображений, этот код будет вращаться между ними.
[self.messageBottom = [[UIImageView alloc] initWithFrame:CGRectMake(289, 262, 171, 38)];
[self addSubview:messageBottom];
[messageBottom setAlpha:0.0];
[messageBottom release];
self.messageTop = [[UIImageView alloc] initWithFrame:CGRectMake(289, 262, 171, 38)];
[self addSubview:messageTop];
[messageTop setAlpha:1.0];
[messageTop release];
self.messageImgsArray =[NSArray arrayWithObjects:
[UIImage imageNamed:@"image1.png"],
[UIImage imageNamed:@"image2.png"],
[UIImage imageNamed:@"image3.png"],
[UIImage imageNamed:@"image4.png"],
[UIImage imageNamed:@"image5.png"],nil];
topIndex = 0, bottomIndex = 1;
[messageTop setImage:[messageImgsArray objectAtIndex:topIndex]];
//The timers time interval is the imageViews animation duration devided by the number of images in the animationImages array. 20/5 = 4
NSTimer *timer = [NSTimer timerWithTimeInterval:2.0
target:self
selector:@selector(onTimer)
userInfo:nil
repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
}
-(void)onTimer{
[UIView animateWithDuration:1 animations:^{
//set the image of the image that is not currently visible
if (messageTop.alpha == 0) {
[messageTop setImage:[messageImgsArray objectAtIndex:topIndex]];
}
if (messageBottom.alpha == 0) {
[messageBottom setImage:[messageImgsArray objectAtIndex:bottomIndex]];
}
//make sure the images rotate
[messageTop setAlpha:messageTop.alpha == 0 ? 1 : 0];
[messageBottom setAlpha:messageBottom.alpha == 0 ? 1 : 0];
//make sure the images play in a loop
topIndex = topIndex < [messageImgsArray count]-1 ? bottomIndex 1 : 0;
bottomIndex = bottomIndex < [messageImgsArray count]-1 ? bottomIndex 1 : 0;
}];
}
Комментарии:
1. как я могу остановить это, т. е. 3 раза?