2013-03-21 11 views
10

हाय I Im UILabel के टेक्स्ट रंग को बदलने की कोशिश कर रहा है, जब लेबल रेक्ट एक UIView को छेड़छाड़ करता है, तो मैं सोच रहा था कि एक संपत्ति या कुछ मैं उपयोग कर सकता हूं। नीचे चित्र में जैसा:उलटा UIlabel टेक्स्ट रंग जब इसकी फ्रेम UIView

enter image description here

किसी से पहले इस मुद्दे को पूरा किया, या मैं क्या इस बात कर शुरू करने के लिए पढ़ना चाहिए?

अग्रिम धन्यवाद

उत्तर

9

अच्छी पहेली! यहां मैं क्या करूँगा:

  1. दो UIViews। आइए एक पृष्ठभूमि को कॉल करें और दूसरा प्रोग्रेसबार। प्रगतिबार को उनके सामान्य superview पर उसी origin के साथ पृष्ठभूमि के शीर्ष पर रखा गया है।
  2. वे दोनों में UILabel को सबव्यूव के रूप में, और दोनों मूल लेबल उनके माता-पिता के सापेक्ष हैं। पृष्ठभूमि में एक अंधेरा backgroundColor है और इसके लेबल में प्रकाश textColor है और प्रगति दृश्य में अन्य चीजें हैं।
  3. Progressbar पृष्ठभूमि की तुलना में संकीर्ण फ्रेम चौड़ाई है और clipsToBounds==YES

चाल है, विचार 'मूल में एक ही और लेबल' मूल एक ही है, और शीर्ष दृश्य पर clipsToBounds साथ, सब कुछ करने जा रहा है है दाएं देखो।

ड्रॉप ReallyCoolProgressView नामक एक नया UIView उपवर्ग में उन दो बार देखा गया है, और यह एक सार्वजनिक विधि दे:

-(void)setProgress:(float)progress प्रगति 0.0 से 1.0 के एक संख्या है। विधि Progressbar चौड़ाई मापता है और दोनों लेबल का पाठ @"Progress %f", progress*100

+2

यह मजेदार लग रहा था, इसलिए मैंने इसे बनाया और यहां चिपकाया: http: // पेस्टबिन।कॉम/ZCDmdpPq यह कुछ त्वरित परीक्षणों में काम किया। – danh

+0

हम्म, हाँ, यह एक अच्छी चाल होगी, सबसे तेज़ और सबसे आसान। धन्यवाद !! – Florik

1

मैं इन तरीकों पर एक नजर है करने के लिए आप सुझाव है:

आप जाँच कर सकते हैं अपने स्ट्रिंग का कितना NSString के आकार की जाँच, इस विधि के साथ द्वारा दृश्य के साथ ओवरलैप होता है:

[yourString sizeWithFont:yourFont constrainedToSize:maximumAllowedSize]; 

फिर आप लेबल के तारों के हिस्से को एक रंग और दूसरे भाग के साथ बाद वाले हिस्से में सेट करने के लिए एक एनएसएमयूटेबल एट्रिब्यूटेड स्ट्रिंग का उपयोग कर सकते हैं।

//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

यह पत्र है कि केवल आंशिक रूप से हालांकि कवर कर रहे हैं के लिए काम नहीं करेगा। मुझे लगता है कि @ फ्लोरिक को कोरग्राफिक्स के साथ कुछ चालाक करने की आवश्यकता होगी और वह जिस प्रभाव को ढूंढ रहा है उसे प्राप्त करने के लिए एक कस्टम ड्रॉक्ट करें। –

+0

हाँ आप सही हैं, उन्हें आंशिक लोगों का समर्थन करने के लिए अपने स्वयं के तार खींचने की आवश्यकता होगी। – guenis

1

this tutorial for creating alpha masks with text पर एक नजर डालें सेट। इस तकनीक का उपयोग करके आप एक मानक प्रगति पट्टी को कार्यान्वित कर सकते हैं जो आपके इच्छित प्रभाव को प्राप्त करने के लिए अग्रभूमि और पृष्ठभूमि दृश्य दोनों में चलता है।

1

किसी भी व्यक्ति के लिए स्विफ्ट में एक उदाहरण बनाया गया जो व्यावहारिक अनुप्रयोग की तलाश में है। इस दान पर महान मार्गदर्शन - धन्यवाद!


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 
     } 
    } 
} 
संबंधित मुद्दे