我正在创建一个简单的“工具提示”子类,它是一个圆角矩形和一个小三角形,将“锚定”到另一个视图.
我创建了一个UILabel子类,并重写’drawRect’来缩小主标签区域并绘制一个三角形.
’roundRect’表示应包含全文的圆角矩形部分.
这一切都很有效,除了我无法在’roundRect’中显示全文.似乎文本不会显示在最后一行(即三角形现在占据的位置).
还有一点需要注意,我正在使用自动布局,并根据需要设置’tooltipLabel’的约束来填充屏幕.这可以按预期工作,因为减少/添加更多文本会显示相应大小的工具提示.但似乎我需要以某种方式通知’工具提示’或’自动布局’,文本应该适合’tooltipLabel’的’roundRect’部分.
屏幕截图#1使用这个’drawTextInRect’方法,你可以看到全文显示,但重叠到’三角’区域(加上它没有插入,这不是所需的外观):
override public func drawTextInRect(rect: CGRect) {
super.drawTextInRect(rect)
// super.drawTextInRect(UIEdgeInsetsInsetRect(rect, UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)))
}
屏幕截图#2使用这个’drawTextInRect’方法和所需的insets(也添加了triangleHeight,以便空格不会被文本写入),你可以看到它切断了第2行和第3行文本,因为它们没有’适合’roundRect’范围:
override public func drawTextInRect(rect: CGRect) {
// super.drawTextInRect(rect)
super.drawTextInRect(UIEdgeInsetsInsetRect(self.roundRect, UIEdgeInsets(top: 10, left: 10, bottom: 10+self.triangleHeight, right: 10)))
}
这是’drawRect’覆盖:
override public func drawRect(rect: CGRect) {
self.roundRect = CGRect(x: rect.minX, y: rect.minY, width: rect.width, height: rect.height-self.triangleHeight)
self.triangleBezier.moveToPoint(CGPoint(x: self.roundRect.midX-self.triangleWidth/2, y: self.roundRect.maxY))
self.triangleBezier.addLineToPoint(CGPoint(x: rect.midX, y: rect.maxY))
self.triangleBezier.addLineToPoint(CGPoint(x: self.roundRect.midX+self.triangleWidth/2, y: self.roundRect.maxY))
self.triangleBezier.closePath()
self.roundRectBezier = UIBezierPath(roundedRect: self.roundRect, cornerRadius: 5.0)
self.roundRectBezier.appendPath(self.triangleBezier)
self.tooltipColor.setFill()
self.roundRectBezier.fill()
super.drawRect(rect)
}
最佳答案 我实际上不会为此子类化UILabel,并使用自动布局约束创建由外部视图和内部标签组成的自己的工具提示类.内部标签确定视图的整个高度.
或者,如果要分配填充,请使用UITextView:Adding space/padding to a UILabel