2017-08-07 14 views
0

重複情報の入力を試みるかどうかをユーザーに知らせるためにポップアップを作成したかったのです。最初は私はポップアップして消えるUILabelを持っていました。サブビュー/制約の追加:サブビューが表示されない理由を理解しようとしています

 UILabel *toastView = [[UILabel alloc] init]; 

     toastView.alpha = 0; 
     toastView.layer.cornerRadius = 4.0f; 
     toastView.layer.borderColor = [UIColor colorWithRed:200.0/255.0 green:199.0/255.0 blue:204.0/255.0 alpha:1].CGColor; 
     CGFloat scale = [[UIScreen mainScreen] scale]; 
     if (scale == 2.0) { 
      // retina screen; 
      toastView.layer.borderWidth = 0.5; 
     } else { 
      // non-retina screen 
      toastView.layer.borderWidth = 1.0; 
     } 
     toastView.backgroundColor = [UIColor colorWithRed:63.0/255.0 green:63.0/255.0 blue:63.0/255.0 alpha:1]; 
     toastView.textAlignment = NSTextAlignmentCenter; 
     [toastView setAdjustsFontSizeToFitWidth:YES]; 
     toastView.text = @" E-Mail has already been added "; 
     toastView.font = [UIFont fontWithName:@"HelveticaNeue" size:toastView.font.pointSize]; 
     toastView.textColor = [UIColor whiteColor]; 
     [toastView setTranslatesAutoresizingMaskIntoConstraints:NO]; 
     [toastView.layer setMasksToBounds:YES]; 
     [self.superview.superview.superview addSubview:toastView]; 
     [[UIApplication sharedApplication].keyWindow bringSubviewToFront:toastView]; 

     [toastView.bottomAnchor constraintEqualToAnchor:self.superview.superview.superview.centerYAnchor].active = YES; 
     [toastView.centerXAnchor constraintEqualToAnchor:self.superview.superview.superview.centerXAnchor].active = YES; 
     [toastView.heightAnchor constraintEqualToConstant:round(self.superview.superview.superview.frame.size.height/12)].active = YES; 
     [toastView.widthAnchor constraintEqualToConstant:round(self.superview.superview.superview.frame.size.width/1.5)].active = YES; 

     [UIView animateWithDuration:0.3 animations:^{ 
      toastView.alpha = 0.95; 
     } completion:^(BOOL finished) { 
      dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1.0 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ 
       [UIView animateWithDuration:0.3 animations:^{ 
        toastView.alpha = 0; 
       } completion:nil]; 
      }); 
     }]; 

これは問題なく機能します。私はイメージを追加したいので、このポップアップの作成を、ビューとメッセージを取り、UILabelとUIImageViewを含むポップアップビューを生成するメソッドに移すことにしました。ここでは、コードは次のとおりです。

+(void)toastAlert:(UIView*)view message:(NSString*)message { 
    UIView *toastView = [[UIView alloc] init]; 
    UILabel *toastLabel = [[UILabel alloc] init]; 
    UIImage *infoImage = [UIImage imageNamed:@"info_white"]; 
    UIImageView *imageView = [[UIImageView alloc] initWithImage:infoImage]; 

    toastView.alpha = 0; 
    toastView.layer.cornerRadius = 4.0f; 
    toastView.layer.borderColor = [UIColor colorWithRed:200.0/255.0 green:199.0/255.0 blue:204.0/255.0 alpha:1].CGColor; 
    CGFloat scale = [[UIScreen mainScreen] scale]; 
    if (scale == 2.0) { 
     // retina screen; 
     toastView.layer.borderWidth = 0.5; 
    } else { 
     // non-retina screen 
     toastView.layer.borderWidth = 1.0; 
    } 

    [toastLabel setTextAlignment:NSTextAlignmentCenter]; 
    [toastLabel setAdjustsFontSizeToFitWidth:YES]; 
    [toastLabel setText:[NSString stringWithFormat:@"%@", message]]; 
    [toastLabel setFont:[UIFont fontWithName:@"HelveticaNeue" size:toastLabel.font.pointSize]]; 
    [toastLabel setTextColor: [UIColor whiteColor]]; 

    toastView.backgroundColor = [UIColor colorWithRed:63.0/255.0 green:63.0/255.0 blue:63.0/255.0 alpha:1]; 
    [toastView setTranslatesAutoresizingMaskIntoConstraints:NO]; 
    [toastView.layer setMasksToBounds:YES]; 
    [view addSubview:toastView]; 
    [[UIApplication sharedApplication].keyWindow bringSubviewToFront:toastView]; 
    [toastView addSubview:toastLabel]; 
    [toastView addSubview:imageView]; 

    [toastView.bottomAnchor constraintEqualToAnchor:view.centerYAnchor].active = YES; 
    [toastView.centerXAnchor constraintEqualToAnchor:view.centerXAnchor].active = YES; 
    [toastView.heightAnchor constraintEqualToConstant:round(view.frame.size.height/12)].active = YES; 
    [toastView.widthAnchor constraintEqualToConstant:round(view.frame.size.width/1.5)].active = YES; 

    [imageView.centerYAnchor constraintEqualToAnchor:toastView.centerYAnchor].active = YES; 
    [imageView.leadingAnchor constraintEqualToAnchor:toastView.leadingAnchor constant:padding].active = YES; 
    [imageView.heightAnchor constraintEqualToConstant:toastView.frame.size.height/2].active = YES; 
    [imageView.widthAnchor constraintEqualToAnchor:toastView.heightAnchor].active = YES; 


    [toastLabel.centerYAnchor constraintEqualToAnchor:toastView.centerYAnchor].active = YES; 
    [toastLabel.centerXAnchor constraintEqualToAnchor:toastView.centerXAnchor constant:imageView.frame.size.width + padding*2].active = YES; 
    [toastLabel.leadingAnchor constraintEqualToAnchor:imageView.trailingAnchor constant:padding].active = YES; 
    [toastLabel.heightAnchor constraintEqualToConstant:toastView.frame.size.height/2].active = YES; 


    [UIView animateWithDuration:0.3 animations:^{ 
     toastView.alpha = 0.95; 
    } completion:^(BOOL finished) { 
     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1.0 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ 
      [UIView animateWithDuration:0.3 animations:^{ 
       toastView.alpha = 0; 
      } completion:nil]; 
     }); 
    }]; 

} 

どんなに私は何をすべきか、しかし、私は唯一のUIViewを表示させることはできない、何のテキストやUILabelは今まで示しています。私は、UIImageViewを追加すると、それが表示されますが、全体のtoastViewのサイズを狂わせます。

私はまだ未熟な開発者ですが、何か基本的なことが間違っていると確信しています...誰かが私に間違ったことを説明することはできますか? (説明がもっと価値があるので、まっすぐ答えを探すだけではありません)

+0

モバイルでちょっと見ているだけですが、後ろの制約をtoastLabelに追加する必要があります。また、最小縮尺率を設定する必要があります。 – agibson007

答えて

1

あなたの自動サイズ変更マスクはあなたの制約と矛盾していたと思います。それはCGRectZeroで始まります。私はあなたが間違っていたことを知るために、各項目に対処しようとします。ここに作業コードがあります。

-(void)alteredToastAlert:(UIView*)targetView message:(NSString*)message { 

    CGFloat padding = 10.0; 
    // i like to start with real frames buggy things happen with CGRectZero 
    UIView *toastView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 300, 200)]; 
    //turn all resizing masks off 
    [toastView setTranslatesAutoresizingMaskIntoConstraints:NO]; 

    UILabel *toastLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 300, 200)]; 
    [toastLabel setTranslatesAutoresizingMaskIntoConstraints:NO]; 

    UIImage *infoImage = [UIImage imageNamed:@"info_white"]; 
    UIImageView *imageView = [[UIImageView alloc] initWithImage:infoImage]; 
    [imageView setTranslatesAutoresizingMaskIntoConstraints:NO]; 
    //has a size but intrinsic 

    toastView.alpha = 0; 
    toastView.layer.cornerRadius = 4.0f; 
    toastView.layer.borderColor = [UIColor colorWithRed:200.0/255.0 green:199.0/255.0 blue:204.0/255.0 alpha:1].CGColor; 
    CGFloat scale = [[UIScreen mainScreen] scale]; 

    if (scale == 2.0) { 
     // retina screen; 
     toastView.layer.borderWidth = 0.5; 
    } else { 
     // non-retina screen 
     toastView.layer.borderWidth = 1.0; 
    } 

    [toastLabel setTextAlignment:NSTextAlignmentCenter]; 
    [toastLabel setText:[NSString stringWithFormat:@"%@", message]]; 
    [toastLabel setFont:[UIFont fontWithName:@"HelveticaNeue" size:22]]; 
    [toastLabel setTextColor: [UIColor whiteColor]]; 

    [toastLabel setMinimumScaleFactor:0.01]; 

    toastView.backgroundColor = [UIColor colorWithRed:63.0/255.0 green:63.0/255.0 blue:63.0/255.0 alpha:1]; 
    [toastView setTranslatesAutoresizingMaskIntoConstraints:NO]; 
    [toastView.layer setMasksToBounds:YES]; 
    [targetView addSubview:toastView]; 
    [[UIApplication sharedApplication].keyWindow bringSubviewToFront:toastView]; 
    //adding here but everything has a frame so it is not size 0. Then apply autolayout 
    [toastView addSubview:toastLabel]; 
    [toastView addSubview:imageView]; 

    [toastView.bottomAnchor constraintEqualToAnchor:targetView.centerYAnchor].active = YES; 
    [toastView.centerXAnchor constraintEqualToAnchor:targetView.centerXAnchor].active = YES; 
    [toastView.heightAnchor constraintEqualToConstant:round(targetView.frame.size.height/12)].active = YES; 
    [toastView.widthAnchor constraintEqualToConstant:round(targetView.frame.size.width/1.5)].active = YES; 

    [imageView.centerYAnchor constraintEqualToAnchor:toastView.centerYAnchor].active = YES; 
    [imageView.leadingAnchor constraintEqualToAnchor:toastView.leadingAnchor constant:padding].active = YES; 
    [imageView.heightAnchor constraintEqualToConstant:toastView.frame.size.height/2].active = YES; 
    [imageView.widthAnchor constraintEqualToAnchor:toastView.heightAnchor].active = YES; 
    imageView.backgroundColor = [UIColor redColor]; 



    [toastLabel.centerYAnchor constraintEqualToAnchor:toastView.centerYAnchor].active = YES; 
    [toastLabel.leadingAnchor constraintEqualToAnchor:imageView.trailingAnchor constant:padding].active = YES; 
    // have to have a trailing to keep it inside the view 
    [toastLabel.trailingAnchor constraintEqualToAnchor:toastView.trailingAnchor constant:padding].active = YES; 
    [toastLabel.heightAnchor constraintEqualToConstant:toastView.frame.size.height/2].active = YES; 

    toastView.alpha = 1; 
    [UIView animateWithDuration:0.3 animations:^{ 
     toastView.alpha = 0.95; 
    } completion:^(BOOL finished) { 
     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1.0 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ 
      [UIView animateWithDuration:0.3 animations:^{ 
       toastView.alpha = 0; 
      } completion:^(BOOL finished){ 
       //may need to remove from superview 
      }]; 
     }); 
    }]; 

} 

1)フレームが先頭に設定されていることがわかります。私はCGRectZeroで始まることにいくつかの狂ったことがあることに気が付いたので、これを行います。私たちは最終的に自動レイアウトによってビューを管理させますが、フレームを設定することを開始します。イメージビューは、それが固有のフレームを確立します。

2)次に、自動サイズ変更マスクから制約を作成しないようにシステムに指示します。私はtoastViewのために、ラベルとイメージビューのようにこれを行います。

3)私はラベルにテキストの最小スケールファクターを教えて、私は任意のフォントサイズの値22から始めます。あなたは50にそれをバンプするかもしれず、それはまだ縮小されます。私はCGRectZeroのフォントサイズが以前は0だったと思うが、私は確信していない

4)あなたの制約は、おそらくラベルの後続の制約の版で作業をさせるが、私はそうだと思う。あなたはそれを見ることができます。

5)これがすべて終了したら、alphaが0でもまだそこにあるので、toastViewをsuperviewまたは渡しているビューから削除するのを忘れないでください。

+1

はい!!!!私はそれを忘れていると信じることはできません。制約の問題を修正し、ビュー内のフレームを設定すると、サブビューが正しく表示されました。私はtoastLabelのcenterXAnchor制約を必要としないので取り除きました。最後に、あなたが示唆したように、後続のアンカーを追加し、完了時にサブビューを削除しました。ありがとうございました。これは、ほとんどの晩、私からの外出を迷惑にしていました。 –

関連する問題