【问题标题】:NSTextAttachment image alignmentNSTextAttachment 图像对齐
【发布时间】:2014-11-20 18:24:00
【问题描述】:

我正在关注@Duncan Groenewald 的这个很酷的教程Implementing Rich Text with Images on OS X and iOS,并且能够在我的UITextView 中显示图像。然而,这些图像并没有像我希望的那样居中。看图

如您所见,我希望我的图像以 X 轴为中心。

我尝试在-attachmentBoundsForTextContainer:proposedLineFragment:glyphPosition:characterIndex 中返回具有适当值的rect,但这并没有帮助。

我还尝试为NSTextAttachment 属性字符串设置NSKernAttributeName。但它所做的只是以某种方式隐藏图像。

【问题讨论】:

    标签: ios image sdk uitextview nstextattachment


    【解决方案1】:

    尝试在附件中设置段落样式,使其居中对齐。

    如果您的图像作为附件嵌入到属性字符串中,您可以通过枚举属性字符串的附件属性来访问它们。 例如:

        attributedContent.enumerateAttribute(NSAttachmentAttributeName, inRange: NSRange(location: 0, length: attributedContent.length), options: nil) { (attribute, range, stop) -> Void in
            if let attachment = attribute as? NSTextAttachment {
    
                // this example assumes you want to center all attachments. You can provide additional logic here. For example, check for attachment.image.
    
                let paragraphStyle = NSMutableParagraphStyle()
                paragraphStyle.alignment = .Center
                attributedContent.addAttribute(NSParagraphStyleAttributeName, value: paragraphStyle, range: range)
            }
        }
    

    【讨论】:

      【解决方案2】:

      这是 Swift 3.1 使用扩展

      extension NSMutableAttributedString {
      
          func setAttachmentsAlignment(_ alignment: NSTextAlignment) {
              self.enumerateAttribute(NSAttachmentAttributeName, in: NSRange(location: 0, length: self.length), options: .longestEffectiveRangeNotRequired) { (attribute, range, stop) -> Void in
                  if attribute is NSTextAttachment {
                      let paragraphStyle = NSMutableParagraphStyle()
                      paragraphStyle.alignment = alignment
                      self.addAttribute(NSParagraphStyleAttributeName, value: paragraphStyle, range: range)
                  }
              }
          }
      
      }
      

      通过这种方式,您可以轻松地为属性字符串上的附件应用对齐方式:

      let attributeString = NSMutableAttributedString(string: "")
      // add attachments
      attributeString.setAttachmentsAlignment(.center) 
      

      【讨论】:

        【解决方案3】:

        这是另一种设置 NSTextAttachment 图像对齐方式的方法。希望这也能帮助那些为此苦苦挣扎的人。我在 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell

        中使用下面的代码
        var buttonText = "My Button";
        
        let align = NSMutableParagraphStyle();
        align.alignment = NSTextAlignment.center;
        align.firstLineHeadIndent = 10.0;
        align.headIndent = 10.0;
        align.tailIndent = -10.0;
        
        let para = NSMutableAttributedString();
        
        // top padding
        para.append(NSAttributedString(string: "\n", attributes: [NSParagraphStyleAttributeName: align, NSFontAttributeName: UIFont(name: "Helvetica", size: 10.0)!, NSForegroundColorAttributeName: UIColor.white]));
        
        // image
        let img = NSTextAttachment();
        img.image = UIImage(named: "MyIcon");
        img.bounds = CGRect(x: 0, y: UIFont(name: "Helvetica", size: 18.0)!.descender, width: img.image!.size.width, height: img.image!.size.height);
        let nas = NSAttributedString(attachment: img).mutableCopy() as! NSMutableAttributedString;
        nas.addAttribute(NSParagraphStyleAttributeName, value: align, range: NSRange(location: 0, length: nas.length));
        para.append(nas);
        
        // space to text
        buttonText = " " + buttonText;
        
        // text
        para.append(NSAttributedString(
            string: buttonText,
            attributes: [NSParagraphStyleAttributeName: align, NSFontAttributeName: UIFont(name: "Helvetica", size: 18.0)!, NSForegroundColorAttributeName: UIColor.black]));
        
        // bottom padding
        para.append(NSAttributedString(string: "\n", attributes: [NSParagraphStyleAttributeName: align, NSFontAttributeName: UIFont(name: "Helvetica", size: 10.0)!, NSForegroundColorAttributeName: UIColor.white]));
        
        // set cell label
        let label = cell.textLabel!;
        label.numberOfLines = 0;
        label.layer.borderWidth = 0;
        label.layer.masksToBounds = false;
        label.backgroundColor = UIColor.clear;
        label.layer.backgroundColor = UIColor.green;
        label.attributedText = para;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-02-01
          • 1970-01-01
          • 2020-06-04
          • 2014-08-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多