0

のこのメソッドを呼び出してUIView、を別のものにプッシュしようとしています:UIViewUINavigationController

signupPageObj = [[SignupPage alloc]initWithNibName:@"SignupPage" bundle:nil];
[self.navigationController pushViewController:signupPageObj animated:YES]; 

しかし、 SignUpPage をロードするのにしばらく時間がかかりましUIViewた。理由はわかりませんが、viewDidLoadメソッドと同様にカスタマイズがあまりないためinitWithNibNameです。

のコード全体をinitWithNibName以下に示します。

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];

    if (self) 
    {
        statusArray=[[NSMutableArray alloc] init];
        UILabel *labelforNavigationTitle = [[UILabel alloc] initWithFrame:CGRectZero];
        labelforNavigationTitle.backgroundColor = [UIColor clearColor];
        labelforNavigationTitle.font = [UIFont fontWithName:FONTSAVINGSBOND size:30.0];
        labelforNavigationTitle.shadowColor = [UIColor colorWithWhite:0.0 alpha:0.5];
        labelforNavigationTitle.textAlignment = UITextAlignmentCenter;
        labelforNavigationTitle.textColor = [UIColor whiteColor]; // change this color
        self.navigationItem.titleView = labelforNavigationTitle;
        labelforNavigationTitle.text = NSLocalizedString(@"Sign Up", @"");
        [labelforNavigationTitle sizeToFit];

    }
    return self;

}


-(void)viewDidLoad
{

    [super viewDidLoad];

    self.fullPathToFile=@"";
    self.gender=@"";
    strForGender=self.gender;
    labelInDatePicker.font=[UIFont fontWithName:FONTCENTURYGOTHICBOLD size:17.0];


    UIImage* imageCancel = [UIImage imageNamed:@"cancelbtn.png"];
    CGRect frameimg = CGRectMake(0, 0, (imageCancel.size.width)/2, (imageCancel.size.height)/2);


    UIButton *cancelButton = [[UIButton alloc] initWithFrame:frameimg];
    [cancelButton setBackgroundImage:imageCancel forState:UIControlStateNormal];
    [cancelButton addTarget:self action:@selector(cancelButtonclickedInAvtar)
         forControlEvents:UIControlEventTouchUpInside];
    [cancelButton setShowsTouchWhenHighlighted:YES];



    self.pickerBirthdayView.frame=CGRectMake(0,460,320,252);
    [self.view addSubview:self.pickerBirthdayView];

    self.avtarView.frame=CGRectMake(0,460,320,460);
    [self.view addSubview:self.avtarView];
    cancelButtonInAvtarView=[[UIBarButtonItem alloc]initWithCustomView:cancelButton];

    self.termsAndConditionPage.frame=CGRectMake(0,460,320,460);
    [self.view addSubview:self.termsAndConditionPage];


    if ([self.navigationController.navigationBar respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)] ) 
    {
        UIImage *image = [UIImage imageNamed:@"titlebg.png"] ;
        [self.navigationController.navigationBar setBackgroundImage:image forBarMetrics:UIBarMetricsDefault];
    }
    [self performSelector:@selector(settingScrollView) withObject:nil afterDelay:1.0];

    scrollPrevButton.hidden=YES;
    scrollNextButton.hidden=NO;

    isSectionExpanded=NO;
    checkForImage=2;
    termsAndConditionChecked=2;
    checkForBackgroundImage=10;
    start=10;


    UIImage* image1 = [UIImage imageNamed:@"backbtn.png"];
    CGRect frameimg1 = CGRectMake(0, 0, (image1.size.width)/2, (image1.size.height)/2);

    UIButton *backButton = [[UIButton alloc] initWithFrame:frameimg1];
    [backButton setBackgroundImage:image1 forState:UIControlStateNormal];
    [backButton addTarget:self action:@selector(popToRootViewController)
         forControlEvents:UIControlEventTouchUpInside];


    //    UIImage* image2 = [UIImage imageNamed:@"submitbtn.png"];
    //    CGRect frameimg2 = CGRectMake(0, 0, (image2.size.width)/2, (image2.size.height)/2);

    //    UIButton *submitButton = [[UIButton alloc] initWithFrame:frameimg2];
    //    [submitButton setBackgroundImage:image2 forState:UIControlStateNormal];
    //    [submitButton addTarget:self action:@selector(submitButtonPressed:)forControlEvents:UIControlEventTouchUpInside];


    UIImage* imageforTermsandConditionPage = [UIImage imageNamed:@"backbtn.png"];
    CGRect frameimgforTermsandConditionPage = CGRectMake(0, 0, (imageforTermsandConditionPage.size.width)/2, (imageforTermsandConditionPage.size.height)/2);

    UIButton *backButtonforTermsandConditionPage = [[UIButton alloc] initWithFrame:frameimgforTermsandConditionPage];
    [backButtonforTermsandConditionPage setBackgroundImage:imageforTermsandConditionPage forState:UIControlStateNormal];
    [backButtonforTermsandConditionPage addTarget:self action:@selector(backtoSignupPage) forControlEvents:UIControlEventTouchUpInside];



    UIImage* imageforChooseIconPage = [UIImage imageNamed:@"backbtn.png"];
    CGRect frameimgforChooseIconPage = CGRectMake(0, 0, (imageforChooseIconPage.size.width)/2, (imageforChooseIconPage.size.height)/2);

    UIButton *backButtonforChooseIconPage = [[UIButton alloc] initWithFrame:frameimgforChooseIconPage];
    [backButtonforChooseIconPage setBackgroundImage:imageforTermsandConditionPage forState:UIControlStateNormal];
    [backButtonforChooseIconPage addTarget:self action:@selector(backtoSignupPage) forControlEvents:UIControlEventTouchUpInside];



    backButton1 = [[UIBarButtonItem alloc] initWithCustomView:backButton];
    self.navigationItem.leftBarButtonItem = backButton1;

    //    submitButton1=[[UIBarButtonItem alloc]initWithCustomView:submitButton];
    //    self.navigationItem.rightBarButtonItem=submitButton1;

    backButtonInTermsAndCondition=[[UIBarButtonItem alloc]initWithCustomView:backButtonforTermsandConditionPage];
    backButtonInChooseIcon=[[UIBarButtonItem alloc]initWithCustomView:backButtonforChooseIconPage];


    CALayer *layer = [self.objTextView layer];
    [layer setMasksToBounds:YES];
    [layer setCornerRadius:10.0];
    [layer setBorderWidth:0.0];
    [layer setBorderColor:[[UIColor lightGrayColor] CGColor]];
}


-(void)settingScrollView
{
    arrOfImages=[NSArray arrayWithObjects:@"Avtar0.png",@"Avtar1.png",@"Avtar2.png",@"Avtar3.png",@"Avtar4.png",@"Avtar5.png",@"Avtar6.png",@"Avtar7.png",@"Avtar8.png",@"Avtar9.png",nil];

    pageControl.numberOfPages = kNumberOfPages;
    pageControl.currentPage = 0;
    pageControl = [[PageControl alloc] initWithFrame:rect] ;
    pageControl.frame = rect;
    pageControl.delegate=self;
    pageControl.numberOfPages=[arrOfImages count];
    pageControl.currentPage = self.currentPage;
    [self.view addSubview:pageControl];

    scrollV = [[UIScrollView alloc]init];
    scrollV.frame=CGRectMake(35,55,250,246);
    scrollV.backgroundColor=[UIColor clearColor];
    scrollV.delegate=self;
    scrollV.pagingEnabled=YES;
    self.scrollV.contentSize = CGSizeMake(self.scrollV.frame.size.width *kNumberOfPages, 220);

    self.scrollV.showsHorizontalScrollIndicator = NO;
    self.scrollV.showsVerticalScrollIndicator = NO;
    self.scrollV.scrollsToTop = NO;
    self.scrollV.delegate = self;

    [self.avtarView addSubview:scrollV];


    for(int k =0;k<arrOfImages.count;k++)
    {

        UIButton *btn=[UIButton  buttonWithType:UIButtonTypeCustom];
        btn.tag=k;
        btn.imageView.contentMode= UIViewContentModeScaleAspectFit;
        [btn setImage:[UIImage imageNamed:[arrOfImages objectAtIndex:k]] forState:UIControlStateNormal];
        [btn setImage:[UIImage imageNamed:[arrOfImages objectAtIndex:k]] forState:UIControlStateHighlighted];
         btn.frame=CGRectMake((self.scrollV.frame.size.width * k),0, 250,241);
        [btn addTarget:self action:@selector(setImageInScrollView:) forControlEvents:UIControlEventTouchUpInside];
        [self.scrollV addSubview:btn];
    }

}

誰かがこれに対する提案や解決策を持っていれば、私はとても助かります。

4

1 に答える 1

2

settingScrollViewあなたがたくさんの画像をロードしていることに気づきました(特に画像が大きい場合)、それは遅くなる可能性があります。また、贅沢なメモリの使用でもあります。この問題には、次の 2 つの一般的な解決策があります。

  1. 非同期のイメージ読み込みを採用できます。イメージをメイン キューにロードするのではなく、GCD (または任意の並行テクノロジ) を使用してバックグラウンドでイメージをロードし、イメージ ビューimageプロパティの設定をメイン キューにディスパッチできます。これにより、パフォーマンスの問題は解決されますが、メモリの問題は解決されません。

  2. さらに良いことに、遅延読み込みを使用して、現在表示されている画像の画像のみを読み込むことができます。次に、View Controller を a に設定UIScrollViewDelegateし、ユーザーが次の画像にスクロールしたら、それをロードします。現在の画像と「次の」画像をロードするこれのバリエーションを実行できます。ユーザーが次の画像にスクロールすると、新しい「次の」画像が遅延してロードされます。ほとんどの遅延読み込み手法では、非同期の画像読み込みも採用されていますが、これは私の最初の観察です。


アップデート:

次の行を置き換えると、画面の表示が明らかに改善されます。

[self performSelector:@selector(settingScrollView) withObject:nil afterDelay:1.0];

だけで:

[self settingScrollView];

しかし、あなたは何らかの理由でそれを少し遅らせていたと思います。おそらく、10 枚の画像の読み込みにかかる遅延が気に入らず、そのせいでユーザー インターフェイス全体の速度が低下することを望まないでしょう。したがって、私の最初の手法である画像の非同期読み込みを使用して、画像の読み込み中にユーザー インターフェイスをブロックしないようにすることができます。それをしたい場合は、forループインsettingScrollViewを次のようなものに置き換えることができます:

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

for (int k = 0; k < arrOfImages.count; k++)
{
    UIButton *btn = [UIButton  buttonWithType:UIButtonTypeCustom];
    btn.tag = k;
    btn.imageView.contentMode = UIViewContentModeScaleAspectFit;
    dispatch_async(queue, ^{

        // retrieve the image in a background queue

        UIImage *image = [UIImage imageNamed:[arrOfImages objectAtIndex:k]];

        // and now update the image property in your UI in the main queue

        dispatch_async(dispatch_get_main_queue(), ^{
            [btn setImage:image forState:UIControlStateNormal];
            [btn setImage:image forState:UIControlStateHighlighted];

            btn.frame=CGRectMake((self.scrollV.frame.size.width * k),0, 250, 241);
            [btn addTarget:self action:@selector(setImageInScrollView:) forControlEvents:UIControlEventTouchUpInside];
            [self.scrollV addSubview:btn];
        });
    });
    // btn.frame=CGRectMake((self.scrollV.frame.size.width * k),0, 250, 241);
    // [btn addTarget:self action:@selector(setImageInScrollView:) forControlEvents:UIControlEventTouchUpInside];
    // [self.scrollV addSubview:btn];
}

そうは言っても、画像の読み込みはimageNamed一般的にそれほど遅くはありません(ただし、画像が非常に大きい場合は、わずかではあるが遅延が発生する可能性があります)。ただし、上記のコードを使用すると、永続ストレージからイメージをロードする際に発生するユーザー インターフェイスの遅延をさらに最小限に抑えることができます。画像がおよそ 250x241 であると仮定すると、パフォーマンスの向上はわずかです (確かに、ユーザー インターフェイスに 10 倍速く戻りますが、画像を同期的に読み込むのに 0.05 秒しかかからなかったのに対し、非同期で読み込むと、UI は0.005 秒)。この手法は、非常にスムーズなテーブルビューのスクロールを撮影する場合や、Web から画像を読み込む場合に非常に役立ちますが、ここで使用する価値があるかどうかは明確ではありません (画像が巨大でない限り)。

2 番目のポイントである画像の遅延読み込みについては、メモリに問題があることを報告しない限り、取り組みません。その場合は、imageNamedメソッドをimageWithContentsOfFile(imageNamed非常に大雑把なキャッシング システムであるため) に置き換え、適切な遅延読み込みスキームでラップします。しかし、画像が 10 個しかないので、そこに行く必要はないかもしれません。したがって、あなたが戻ってきて、重大なメモリの問題があることを報告しない限り、その解決策を延期します.

于 2013-01-18T16:41:11.030 に答える