how to resize an image or done as a NSAttributedString NSTextAttachment (or set its initital size)

前端 未结 5 1865
没有蜡笔的小新
没有蜡笔的小新 2020-11-30 08:24

I have a NSAttributedString to which I am adding a NSTextAttachment. The image is 50w by 50h but I\'d like it to scale down to reflect the line height of the attributed stri

相关标签:
5条回答
  • 2020-11-30 09:04

    Look at subclassing NSTextAttachment and implementing the NSTextAttachmentContainer methods to return different sizes based on the text container supplied. By default, NSTextAttachment just returns the size of the image it is provided with.

    0 讨论(0)
  • 2020-11-30 09:06

    Swift4 if you want a attributed string along with the image or a icon

    here you can do something like this.

    func AttributedTextwithImgaeSuffixAndPrefix(AttributeImage1 : UIImage , AttributedText : String ,AttributeImage2 : UIImage,  LabelBound : UILabel) -> NSMutableAttributedString
    {
        let fullString = NSMutableAttributedString(string: "  ")
        let image1Attachment = NSTextAttachment()
        image1Attachment.bounds = CGRect(x: 0, y: ((LabelBound.font.capHeight) - AttributeImage1.size.height).rounded() / 2, width: AttributeImage1.size.width, height: AttributeImage1.size.height)
        image1Attachment.image = AttributeImage1
        let image1String = NSAttributedString(attachment: image1Attachment)
        let image2Attachment = NSTextAttachment()
        image2Attachment.bounds = CGRect(x: 0, y: ((LabelBound.font.capHeight) - AttributeImage2.size.height).rounded() / 2, width: AttributeImage2.size.width, height: AttributeImage2.size.height)
        image2Attachment.image = AttributeImage2
        let image2String = NSAttributedString(attachment: image2Attachment)
        fullString.append(image1String)
        fullString.append(NSAttributedString(string: AttributedText))
        fullString.append(image2String)
        return fullString
    }

    you can use this code as mentioned below:

            self.lblMid.attributedText = AttributedTextwithImgaeSuffixAndPrefix(AttributeImage1: #imageLiteral(resourceName: "Left") , AttributedText: "  Payment Details  ", AttributeImage2: #imageLiteral(resourceName: "RIght") , LabelBound: self.lblMid)

    here you can add images you can replace it with your own:

    Left Image

    Right Image

    Out put will be like this

    0 讨论(0)
  • 2020-11-30 09:13

    If you need to resize a bunch of NSTextAttachment images while keeping their aspect ratio i've written a handy extension: http://hack.swic.name/convenient-nstextattachment-image-resizing

    extension NSTextAttachment {
        func setImageHeight(height: CGFloat) {
            guard let image = image else { return }
            let ratio = image.size.width / image.size.height
    
            bounds = CGRect(x: bounds.origin.x, y: bounds.origin.y, width: ratio * height, height: height)
        }
    }
    

    Example usage:

    let textAttachment = NSTextAttachment()
    textAttachment.image = UIImage(named: "Image")
    textAttachment.setImageHeight(16) // Whatever you need to match your font
    
    let imageString = NSAttributedString(attachment: textAttachment)
    yourAttributedString.appendAttributedString(imageString)
    
    0 讨论(0)
  • 2020-11-30 09:21

    You should set bounds form attachment to resize image like this:

    attachment.bounds = CGRectMake(0, 0, yourImgWidth, yourImgHeight)

    0 讨论(0)
  • 2020-11-30 09:27

    NSTextAtatchment is just a holder for a UIImage so scale the image when it needs scaling and recreate the text attachment or set it's image. You'll need to force a nslayout update if you change the image on an existing text attachment.

    0 讨论(0)
提交回复
热议问题