2014-11-20 110 views
6

我正在关注@Duncan Groenewald的这个很酷的教程Implementing Rich Text with Images on OS X and iOS,并且能够在我的UITextView中显示图像。但是,这些图像并非以我希望它们的方式居中。请查看图片NSTextAttachment图像对齐

NSTextAttachment sample image

正如你可以看到,我想在X轴为中心我的形象。

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

我也试着为NSTextAttachment属性字符串设置NSKernAttributeName。但它所做的只是隐藏了一些图像。

回答

5

尝试使用中心对齐方式在附件上设置段落样式。

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

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) 
     } 
    } 
+0

谢谢!这工作就像一个魅力! – Vik 2015-11-24 15:12:12

0

这里的另一种方式如何设置对齐方式的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; 
1

这是夫特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)