当UI框架与UIView相交时反转UI标签文字颜色

嗨我试图改变UILabel的文本颜色的情况下,当标签矩形相交UIView,我想也许有一个属性或我可以使用的东西。 如下图所示:

在这里输入图像说明

以前有人遇到这个问题,或者我应该读什么来开始做这件事?

提前致谢

好难题! 这是我会做的:

  1. 两个UIViews。 我们来调用一个背景,另一个调用progressBar。 progressBar堆叠在背景上,并且在共同的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

我build议你看看这些方法:

你可以通过检查NSString的大小来检查你的string有多less与视图重叠,用下面的方法:

 [yourString sizeWithFont:yourFont constrainedToSize:maximumAllowedSize]; 

然后你可以使用一个NSMutableAttributedString来将标签的部分string设置为一种颜色,而后者则使用另一种颜色。

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

看看这个教程创build文本的alpha蒙版 。 使用这种技术,您可以实现一个标准的进度条,在前景和背景视图之间移动,以达到您想要的效果。

在Swift中为所有正在寻找实际应用的人员构build了一个示例。 伟大的指导,在这个丹 – 谢谢!


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