2013-03-21 9 views

答えて

9

グッドパズル!私がすることは次のとおりです。

  1. 2つのUIView。 1つを背景とし、もう1つをprogressBarとしましょう。 progressBarは背景の上に同じoriginを共通のsuperviewに積み重ねています。
  2. は両方ともサブビューとしてUILabelを持ち、両方のラベルがその親に対して同じ起点にあります。背景は暗いbackgroundColorで、そのラベルには明るいtextColorがあり、進捗状況には逆のものがあります。
  3. プログレスバーは、バックグラウンドよりも狭いフレーム幅を有し、平面上のビューの起源と同じとラベルは同じ起源、およびclipsToBoundsとclipsToBounds==YES

トリックがあるが、すべてがために起こっている持っています右に見て。

ドロップReallyCoolProgressViewと呼ばれる新しいUIViewのサブクラスにこれら二つのビューは、それに1つのパブリックメソッドを与える:

-(void)setProgress:(float)progress進展が0.0から1.0までの数です。この方法は、ProgressBar幅をスケーリングし、ラベルの両方のテキスト@"Progress %f", progress*100

+2

これは面白かったので、私はそれを作り、ここに貼り付けました:http:// pastebin。com/ZCDmdpPqいくつかの簡単なテストで動作しました。 – danh

+0

ハム、ええ、素早く簡単な素敵なトリックでしょう。ありがとうございました !! – Florik

1

おかげで、私はこれらのメソッドを見てすることができことをお勧め:

あなたはこの方法では、NSStringののサイズをチェックして、ビューと重なっているどのくらいのあなたの文字列のチェックがあります。

次に、NSMutableAttributedStringを使用して、ラベルの文字列の一部を1つの色に設定し、後者の部分を別の色で設定することができます。

//Just an example usage 
//It sets the color of characters starting from 3 to the end to blue 
[str addAttribute:NSForegroundColorAttributeName value:[UIColor blueColor] range:NSMakeRange(3, str.length)]; 


//Now you have to set your string as attributed text just like below 
//UILabels now support attributed strings by default which is quite handy 

[yourLabel setAttributedString:str]; 
+0

これは部分的にしかいえ覆われている文字のために動作しません。私は@FlorikがCoreGraphicsとカスタムDrawRectを使って賢いことをする必要があると思います。 –

+0

あなたは正しいです、彼はまた、部分的なものをサポートするために彼自身の文字列を描く必要があります。 – guenis

1

this tutorial for creating alpha masks with textを見てみましょうを設定します。この手法を使用すると、フォアグラウンドビューとバックグラウンドビューの両方を移動する標準のプログレスバーを実装して、必要な効果を得ることができます。

1

実用的なアプリケーションを探している人のためにSwiftに例を作成しました。このダンの素晴らしい指導 - ありがとう!


import UIKit 

class CDSlideView: UIView { 

    var leftBackView: UIView! 
    var leftBackLabel: UILabel! 
    var leftFrontView: UIView! 
    var leftFrontLabel: UILabel! 

    var rightBackView: UIView! 
    var rightBackLabel: UILabel! 
    var rightFrontView: UIView! 
    var rightFrontLabel: UILabel! 

    var foregroundView: UIView! 
    var backgroundView: UIView! 

    var slideGesture: UIPanGestureRecognizer! 

    let lightColor: UIColor = UIColor.whiteColor() 
    let darkColor: UIColor = UIColor.blueColor() 
    let leftText: String = "Search" 
    let rightText: String = "New" 

    var viewWidth: CGFloat! 
    var viewHeight: CGFloat! 
    var leftOrigin: CGFloat! 
    var rightOrigin: CGFloat! 
    var foregroundPadding: CGFloat = 4 

    override init(frame: CGRect) { 
     super.init(frame: frame) 

     // Init variables variables 
     viewWidth = self.frame.size.width 
     viewHeight = self.frame.size.height 
     leftOrigin = foregroundPadding/2 
     rightOrigin = (viewWidth - foregroundPadding)/2 + foregroundPadding/2 

     backgroundView = UIView() 
     backgroundView.frame = CGRectMake(0, 0, viewWidth, viewHeight) 
     backgroundView.layer.cornerRadius = backgroundView.frame.size.height/2 
     self.addSubview(backgroundView) 

     leftBackView = UIView() 
     leftBackView.frame = CGRectMake(0, 0, backgroundView.frame.size.width/2, backgroundView.frame.size.height) 
     self.backgroundView.addSubview(leftBackView) 

     leftBackLabel = UILabel() 
     leftBackLabel.frame = CGRectMake(0, 0, leftBackView.frame.size.width, leftBackView.frame.size.height) 
     leftBackLabel.font = UIFont.systemFontOfSize(13, weight: UIFontWeightSemibold) 
     leftBackLabel.backgroundColor = UIColor.clearColor() 
     leftBackLabel.lineBreakMode = .ByClipping 
     leftBackLabel.textAlignment = .Center 
     self.leftBackView.addSubview(leftBackLabel) 

     rightBackView = UIView() 
     rightBackView.frame = CGRectMake(backgroundView.frame.size.width/2, 0, backgroundView.frame.size.width/2, backgroundView.frame.size.height) 
     self.backgroundView.addSubview(rightBackView) 

     rightBackLabel = UILabel() 
     rightBackLabel.frame = CGRectMake(0, 0, rightBackView.frame.size.width, rightBackView.frame.size.height) 
     rightBackLabel.font = UIFont.systemFontOfSize(13, weight: UIFontWeightSemibold) 
     rightBackLabel.backgroundColor = UIColor.clearColor() 
     rightBackLabel.lineBreakMode = .ByClipping 
     rightBackLabel.textAlignment = .Center 
     self.rightBackView.addSubview(rightBackLabel) 

     foregroundView = UIView() 
     foregroundView.frame = CGRectMake(foregroundPadding/2, foregroundPadding/2, (backgroundView.frame.size.width - foregroundPadding)/2, backgroundView.frame.size.height - foregroundPadding) 
     foregroundView.clipsToBounds = true 
     foregroundView.layer.cornerRadius = (foregroundView.frame.size.height - foregroundPadding/2)/2 
     self.addSubview(foregroundView) 

     slideGesture = UIPanGestureRecognizer(target: self, action: #selector(CDSlideView.slideAction)) 
     self.foregroundView.addGestureRecognizer(slideGesture) 

     leftFrontView = UIView() 
     leftFrontView.frame = CGRectMake(0, 0, backgroundView.frame.size.width/2, backgroundView.frame.size.height) 
     self.foregroundView.addSubview(leftFrontView) 

     leftFrontLabel = UILabel() 
     leftFrontLabel.font = UIFont.systemFontOfSize(13, weight: UIFontWeightSemibold) 
     leftFrontLabel.backgroundColor = UIColor.clearColor() 
     leftFrontLabel.translatesAutoresizingMaskIntoConstraints = false 
     leftFrontLabel.lineBreakMode = .ByClipping 
     leftFrontLabel.textAlignment = .Center 
     self.leftFrontView.addSubview(leftFrontLabel) 

     let leftFrontLabelLeadingConstraint = NSLayoutConstraint(item: leftFrontLabel, attribute: .Leading, relatedBy: .Equal, toItem: self, attribute: .Leading, multiplier: 1, constant: self.backgroundView.frame.origin.x) 
     self.addConstraint(leftFrontLabelLeadingConstraint) 

     let leftFrontLabelTopConstraint = NSLayoutConstraint(item: leftFrontLabel, attribute: .Top, relatedBy: .Equal, toItem: self, attribute: .Top, multiplier: 1, constant: self.backgroundView.frame.origin.y) 
     self.addConstraint(leftFrontLabelTopConstraint) 

     let leftFrontLabelWidthConstraint = NSLayoutConstraint(item: leftFrontLabel, attribute: .Width, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: leftFrontView.frame.size.width) 
     self.addConstraint(leftFrontLabelWidthConstraint) 

     let leftFrontLabelHeightConstraint = NSLayoutConstraint(item: leftFrontLabel, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: leftFrontView.frame.size.height) 
     self.addConstraint(leftFrontLabelHeightConstraint) 

     rightFrontView = UIView() 
     rightFrontView.frame = CGRectMake(backgroundView.frame.size.width/2, 0, backgroundView.frame.size.width/2, backgroundView.frame.size.height) 
     self.foregroundView.addSubview(rightFrontView) 

     rightFrontLabel = UILabel() 
     rightFrontLabel.font = UIFont.systemFontOfSize(13, weight: UIFontWeightSemibold) 
     rightFrontLabel.backgroundColor = UIColor.clearColor() 
     rightFrontLabel.translatesAutoresizingMaskIntoConstraints = false 
     rightFrontLabel.lineBreakMode = .ByClipping 
     rightFrontLabel.textAlignment = .Center 
     self.rightFrontView.addSubview(rightFrontLabel) 

     let rightFrontLabelTrailingConstraint = NSLayoutConstraint(item: self, attribute: .Trailing, relatedBy: .Equal, toItem: rightFrontLabel, attribute: .Trailing, multiplier: 1, constant: self.backgroundView.frame.origin.x) 
     self.addConstraint(rightFrontLabelTrailingConstraint) 

     let rightFrontLabelTopConstraint = NSLayoutConstraint(item: rightFrontLabel, attribute: .Top, relatedBy: .Equal, toItem: self, attribute: .Top, multiplier: 1, constant: self.backgroundView.frame.origin.y) 
     self.addConstraint(rightFrontLabelTopConstraint) 

     let rightFrontLabelWidthConstraint = NSLayoutConstraint(item: rightFrontLabel, attribute: .Width, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: rightFrontView.frame.size.width) 
     self.addConstraint(rightFrontLabelWidthConstraint) 

     let rightFrontLabelHeightConstraint = NSLayoutConstraint(item: rightFrontLabel, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: rightFrontView.frame.size.height) 
     self.addConstraint(rightFrontLabelHeightConstraint) 

     let leftTapGesture: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(CDSlideView.leftTap(_:))) 
     self.leftBackView.addGestureRecognizer(leftTapGesture) 

     let rightTapGesture: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(CDSlideView.rightTap(_:))) 
     self.rightBackView.addGestureRecognizer(rightTapGesture) 

     self.setLabelText(leftText, rightText: rightText) 
     self.setLightColor(lightColor) 
     self.setDarkColor(darkColor) 
    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

    // MARK: Setup 
    func setLightColor(lightColor: UIColor) { 
     let lightColor = lightColor 
     self.foregroundView.backgroundColor = lightColor 
     self.leftBackLabel.textColor = lightColor 
     self.rightBackLabel.textColor = lightColor 
    } 

    func setDarkColor(darkColor: UIColor) { 
     let darkColor = darkColor 
     self.backgroundView.backgroundColor = darkColor 
     self.leftFrontLabel.textColor = darkColor 
     self.rightFrontLabel.textColor = darkColor 
    } 

    func setLabelText(leftText: String, rightText: String) { 
     self.leftFrontLabel.text = leftText 
     self.leftBackLabel.text = leftText 
     self.rightFrontLabel.text = rightText 
     self.rightBackLabel.text = rightText 
    } 

    // MARK: Actions 
    func slideAction(sender: UIPanGestureRecognizer) { 
     if sender.state == .Began || sender.state == .Changed { 
      let translation = sender.translationInView(self) 

      // Calculate where the user is trying to drag 
      var newCenter: CGPoint = CGPointMake(sender.view!.center.x + translation.x, sender.view!.center.y) 

      // Limit bounds & update center 
      newCenter.x = max(self.frame.size.width * 0.25 + foregroundPadding/2, newCenter.x) 
      newCenter.x = min(self.frame.size.width * 0.75 - foregroundPadding/2, newCenter.x) 

      // Set new center 
      sender.view!.center = newCenter 
      sender.setTranslation(CGPointMake(0,0), inView: self) 
     } else if sender.state == .Ended { 
      let senderVCX = sender.view?.center.x 

      // Snap to side 
      if senderVCX <= viewWidth/2 { 
       print("called left") 
       sender.view?.frame.origin.x = self.leftOrigin 
      } else { 
       print("called right") 
       sender.view?.frame.origin.x = self.rightOrigin 
      } 
     } 
    } 

    func leftTap(sender: UITapGestureRecognizer) { 
     UIView.animateWithDuration(0.05) { 
      self.foregroundView.frame.origin.x = self.leftOrigin 
     } 
    } 

    func rightTap(sender: UITapGestureRecognizer) { 
     UIView.animateWithDuration(0.05) { 
      self.foregroundView.frame.origin.x = self.rightOrigin 
     } 
    } 
} 
関連する問題