【问题标题】:Is a "for loop" the best method to use for my simple random image app?“for循环”是用于我的简单随机图像应用程序的最佳方法吗?
【发布时间】:2013-12-11 23:46:33
【问题描述】:

我希望在加载应用后每 10 秒随机刷新一次图像。类似于屏幕保护程序。我需要触发循环或其他东西的开始。请问在.m文件的什么地方放循环函数。

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController


-(IBAction)randomize:(id)sender

    {

{ int randomimages = rand()% 5;
    switch (randomimages) {
        case 0:
            imageView.image = [UIImage imageNamed:@"...jpg"];
            break;

        case 1:
            imageView.image = [UIImage imageNamed:@"...jpg"];
            break;

        case 2:
            imageView.image = [UIImage imageNamed:@"...jpg"];
            break;

        case 3:
            imageView.image = [UIImage imageNamed:@"...jpg"];

            break;

        case 4:
            imageView.image = [UIImage imageNamed:@"...jpg"];

            break;
    }
    }
}

-(IBAction)randomize2:(id)sender

{int randomimages = rand()% 5;
            switch (randomimages) {
                case 0:
                    imageView2.image = [UIImage imageNamed:@"...jpg"];
                    break;

                case 1:
                    imageView2.image = [UIImage imageNamed:@"...jpg"];
                    break;

                case 2:
                    imageView2.image = [UIImage imageNamed:@"...jpg"];
                    break;

                case 3:
                    imageView2.image = [UIImage imageNamed:@"...jpg"];

                    break;

                case 4:
                    imageView2.image = [UIImage imageNamed:@"...jpg"];

                    break;


            }
        }


- (void)viewDidLoad
{
    [super viewDidLoad];

    // Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

【问题讨论】:

    标签: ios image random uiimageview


    【解决方案1】:

    不要使用 for 循环,使用 NSTimer 来调用选择和更新图像的方法。在viewDidAppear:invalidate 中启动计时器viewDidDisappear:

    另外,考虑将图像命名为数字,这样就不需要 switch 语句。相反,你可以有类似的东西:

    imageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"%d.jpg", randomimages]];
    

    并且您可以使用图像计数来限制随机数的生成。

    【讨论】:

      【解决方案2】:

      正如@Wain 之前提到的,您应该使用 NSTimer。这是另一种方法。每个 NSObject(你的控制器和每个类都是 NSObject 类的实例)都有一个方法: performSelector:withObject:afterDelay:

      在你的情况下使用可以使用它:

       -(void)viewDidLoad {
            [self performSelector:@selector(changeImage) withObject:nil afterDelay:10];
       }
      

      在changeImage方法内部

      -(void)changeImage {
      
          ... // here you will show image
      
          [self performSelector:@selector(changeImage) withObject:nil afterDelay:10];
      }
      

      这将形成一个无限循环。

      【讨论】:

      • 非常感谢您提供的帮助,现在图像每 10 秒随机一次,非常有帮助:)
      【解决方案3】:

      我还可以建议你将图像放在一个数组中,然后使用 ObjectAtIndex 获取它们

      imageBgs = [NSMutableArray arrayWithObjects:@"1.png",@"4.png", nil];
      int index = arc4random() % [imageBgs count];
      UIImage *bla = [imageBgs objectAtIndex:index]; 
      

      【讨论】:

      • 将所有图像保存到数组中会大大增加内存占用。最好保存一组图像名称字符串,并随机加载图像名称。
      【解决方案4】:

      正如其他人所说,for 循环不是要走的路。

      anatoliy_v 可能有最好的建议,使用 performSelector:withObject:afterDelay。

      至于如何选择图片:

      我会创建一个图像文件名数组。然后每次您的 changeImage 方法触发时,选择一个随机索引并使用该名称加载图像。

      但是,这种方法有时会导致您将同一图像连续显示两次,或者可能连续显示多次。

      一种奇特的方法是创建一个包含所有文件名的“feeder”数组。然后将 feeder 数组复制到一个可变数组中。从可变数组中一次获取一个文件名并将其删除。当可变数组为空时,从 feeder 数组重新加载它。像这样的东西(基于 anatoliy_v 的代码):

       -(void)viewDidLoad 
      {
        self.feederArray = @[
          @"file1",
          @"file2",
          @"file3",
          @"file4",
          @"file5",
          @"file6",
          @"file7",
          @"file8",
          @"file9",
          @"file10"
        ];
        self.randomArray = [NSMutableArray arrayWithCapacity: [self.feederArray count]];
        [self changeImage]; //load a random image immediately and start the timer to change it
       }
      
      
      -(void)changeImage 
      {
        //If our randomArray is empty, populate it from the feeder array.
        if ([self.randomArray count] == 0)
          [self.randomArray addObjectsFromArray: self.feederArray];
      
        //Select randomly from the array of remaining random images.
        int index = arc4random_uniform([self.randomArray count]);
        NSString *filename = self.randomArray[index];
        [self.randomArray removeObjectAtIndex: index];
      
        //Now show the image who's name is in filename
        //...
      
        //Finally, queue up another call to changeImage 10 seconds later to load a new image.
        [self performSelector:@selector(changeImage) withObject:nil afterDelay:10];
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-01-27
        • 1970-01-01
        • 2018-12-31
        • 1970-01-01
        • 2012-04-09
        • 1970-01-01
        • 2022-01-15
        相关资源
        最近更新 更多