Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/116.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 使用UILabel上的收缩手势调整字体和标签框架的大小?_Ios_Swift_Uilabel_Pinchzoom_Uipinchgesturerecognizer - Fatal编程技术网

Ios 使用UILabel上的收缩手势调整字体和标签框架的大小?

Ios 使用UILabel上的收缩手势调整字体和标签框架的大小?,ios,swift,uilabel,pinchzoom,uipinchgesturerecognizer,Ios,Swift,Uilabel,Pinchzoom,Uipinchgesturerecognizer,每当用户在标签上使用挤压手势调整标签大小时,平滑地增加或减少字体大小 注 在不影响字体质量的情况下 不仅改变了UILabel的规模 支持多行文字 旋转姿势应与挤压姿势配合使用 参考:SnapChat或Instagram文本编辑器工具 扩展字符串{ func高度(withConstrainedWidth-width:CGFloat,font:UIFont)->CGFloat{ let constraintRect=CGSize(宽度:宽度,高度:.greatestfinitemagnity)

每当用户在标签上使用挤压手势调整标签大小时,平滑地增加或减少字体大小

  • 在不影响字体质量的情况下
  • 不仅改变了UILabel的规模
  • 支持多行文字
  • 旋转姿势应与挤压姿势配合使用
  • 参考:SnapChat或Instagram文本编辑器工具

扩展字符串{
func高度(withConstrainedWidth-width:CGFloat,font:UIFont)->CGFloat{
let constraintRect=CGSize(宽度:宽度,高度:.greatestfinitemagnity)
让boundingBox=self.boundingRect(带:constraintRect,选项:。usesLineFragmentOrigin,属性:[NSAttributedStringKey.font:UIFont(名称:font.fontName,大小:font.pointSize)!],上下文:nil)
返回天花板(边界框高度)
}
func宽度(withConstrainedHeight高度:CGFloat,font:UIFont)->CGFloat{
让constraintRect=CGSize(宽度:。最大有限大小,高度:高度)
让boundingBox=self.boundingRect(带:constraintRect,选项:。usesLineFragmentOrigin,属性:[NSAttributedStringKey.font:UIFont(名称:font.fontName,大小:font.pointSize)!],上下文:nil)
返回单元格(边框宽度)
}
}
func resizeLabelToText(文本标签:UILabel)
{
让labelFont=textLabel.font
让labelString=textLabel.text
让labelWidth:CGFloat=labelString!.width(带约束高度:textLabel.frame.size.height,字体:labelFont!)
让labelHeight:CGFloat=labelString!.height(withConstrainedWidth:labelWidth,font:labelFont!)
textlab.frame=CGRect(x:textlab.frame.origin.x,y:textlab.frame.origin.y,宽度:labelWidth,高度:labelHeight)
textLabel.font=labelFont
}
func PinchedRecognitize(pinchGesture:UIPinchGestureRecognitizer){
guard pinchGesture.view!=nil else{return}
如果(pinchGesture.view是UILabel){
让selectedTextLabel=pinchGesture.view为!UILabel
如果pinchGesture.state==.Start | | pinchGesture.state==.changed{
让pinchScale=圆形(pinchGesture.scale*1000)/1000.0
如果(平刻度<1){
selectedTextLabel.font=selectedTextLabel.font.withSize(selectedTextLabel.font.pointSize-pinchScale)
}
否则{
selectedTextLabel.font=selectedTextLabel.font.withSize(selectedTextLabel.font.pointSize+pinchScale)
}
resizeLabelToText(文本标签:selectedTextLabel)
}
}
}

每次更改UILabel大小后调用以下方法

func labelSizeHasBeenChangedAfterPinch(_ label:UILabel, currentSize:CGSize){
        let MAX = 25
        let MIN = 8
        let RATE = -1
        for proposedFontSize in stride(from: MAX, to: MIN, by: RATE){
            let options = NSStringDrawingOptions.usesFontLeading.union(.usesLineFragmentOrigin)
            let attribute = [NSAttributedString.Key.font:UIFont.systemFont(ofSize: CGFloat(proposedFontSize))]
            // let context = IF NEEDED ...
            let rect =  NSString(string: label.text ?? "").boundingRect(with: currentSize, options: options, attributes: attribute, context: nil)
            let labelSizeThatFitProposedFontSize = CGSize(width: rect.width , height: rect.height)
            if (currentSize.height > labelSizeThatFitProposedFontSize.height) && (currentSize.width > labelSizeThatFitProposedFontSize.width){
                DispatchQueue.main.async {
                    label.font = UIFont.systemFont(ofSize: CGFloat(proposedFontSize))
                }
                break
            }
        }
    }
您可以尝试:

1-设置此标签的最大字体大小

2-设置换行符以截断尾部

3-将自动收缩设置为最小字体大小(最小大小)


我用下面的代码解决了这个问题,这些代码与前面提到的Snapchat和Instagram类似,在各个方面都运行良好:

var pointSize: CGFloat = 0
@objc func pinchRecoginze(_ pinchGesture: UIPinchGestureRecognizer) {
    guard pinchGesture.view != nil else {return}

    let view = pinchGesture.view!
    if (pinchGesture.view is UILabel) {
        let textLabel = view as! UILabel

        if pinchGesture.state == .began {
            let font = textLabel.font
            pointSize = font!.pointSize

            pinchGesture.scale = textLabel.font!.pointSize * 0.1
        }
        if 1 <= pinchGesture.scale && pinchGesture.scale <= 10  {
            textLabel.font = UIFont(name: textLabel.font!.fontName, size: pinchGesture.scale * 10)

            resizeLabelToText(textLabel: textLabel)
        }
    }
}

func resizeLabelToText(textLabel : UILabel) {
    let labelSize = textLabel.intrinsicContentSize
    textLabel.bounds.size = labelSize
}
var pointSize:CGFloat=0
@objc func PinchResochinze(uPinchEsture:UIPinchEstureRecognizer){
guard pinchGesture.view!=nil else{return}
让视图=pinchGesture.view!
如果(pinchGesture.view是UILabel){
让textLabel=查看为!UILabel
如果pinchGesture.state==。开始{
让font=textLabel.font
pointSize=font!.pointSize
pinchGesture.scale=textLabel.font!.pointSize*0.1
}

如果你的问题应该以a的形式包含所有相关代码。如果没有a,你的问题将被视为离题SO@FE_Tech更新了详细信息。我尝试了此操作,但没有按预期工作。字体在收缩缩放时变得模糊,并且无法使用多行文本呈现正确的输出。非常好的解决方案
var pointSize: CGFloat = 0
@objc func pinchRecoginze(_ pinchGesture: UIPinchGestureRecognizer) {
    guard pinchGesture.view != nil else {return}

    let view = pinchGesture.view!
    if (pinchGesture.view is UILabel) {
        let textLabel = view as! UILabel

        if pinchGesture.state == .began {
            let font = textLabel.font
            pointSize = font!.pointSize

            pinchGesture.scale = textLabel.font!.pointSize * 0.1
        }
        if 1 <= pinchGesture.scale && pinchGesture.scale <= 10  {
            textLabel.font = UIFont(name: textLabel.font!.fontName, size: pinchGesture.scale * 10)

            resizeLabelToText(textLabel: textLabel)
        }
    }
}

func resizeLabelToText(textLabel : UILabel) {
    let labelSize = textLabel.intrinsicContentSize
    textLabel.bounds.size = labelSize
}