2014-09-10 2 views
1

Я разрабатываю lib для уценки с быстрым и работает отлично! Но есть небольшая проблема, когда я загружаю изображения в уценке я ставлю заполнитель изображение и отправку другого способа, чтобы загрузить исходное изображение, как это:Отображение изображения с url с помощью заполнителя в UITextView с атрибутной строкой

var attachment: NSTextAttachment = NSTextAttachment() 

      attachment.image = UIImage(named: "placeholder.png") 
      attachment.bounds = CGRect(origin: CGPointZero, size: attachment.image.size.width > UIScreen.mainScreen().bounds.width ? CGSizeMake(UIScreen.mainScreen().bounds.width, UIScreen.mainScreen().bounds.width/attachment.image.size.width * attachment.image.size.height) : attachment.image.size) 

      dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {() -> Void in 
       let imageData: NSData = NSData(contentsOfURL: url) 

       attachment.image = UIImage(data: imageData) 
       attachment.bounds = CGRect(origin: CGPointZero, size: attachment.image.size.width > UIScreen.mainScreen().bounds.width ? CGSizeMake(UIScreen.mainScreen().bounds.width, UIScreen.mainScreen().bounds.width/attachment.image.size.width * attachment.image.size.height) : attachment.image.size) 
       self.textView.setNeedsDisplay() 
      }) 

      let attributedString: NSAttributedString = NSAttributedString(attachment: attachment) 
      let lineBreak: NSAttributedString = NSAttributedString(string: "\n") 

      self.markdown.deleteCharactersInRange(matchRange) 

      self.markdown.insertAttributedString(attributedString, atIndex: matchRange.location) 
      self.markdown.insertAttributedString(lineBreak, atIndex: matchRange.location) 

, но после загрузки держателя изображения места не исчезает, пока пользователь начните прокрутку, неожиданно верните изображение!

Так что мне интересно узнать, в чем проблема?

ответ

0

Вы пытаетесь изменить UI из глобальной очереди, это может не сработать. Возможно, вам придется использовать основную очередь для этого.

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {() -> Void in 
    let imageData: NSData = NSData(contentsOfURL: url) 
    let image = UIImage(data: imageData) 

    dispatch_async(dispatch_get_main_queue()) { 
     // On the main queue (the main thread) 
     attachment.image = image 
     attachment.bounds = CGRect(origin: CGPointZero, size: attachment.image.size.width > UIScreen.mainScreen().bounds.width ? CGSizeMake(UIScreen.mainScreen().bounds.width, UIScreen.mainScreen().bounds.width/attachment.image.size.width * attachment.image.size.height) : attachment.image.size) 
     self.textView.setNeedsDisplay() 
    } 
}) 
+0

Это не работа! точно так же, как и раньше, когда я начинаю прокручивать замену заполнителя на исходное изображение! есть ли у вас другая идея? – Aryan

+0

Как насчет вызова NSTextStorage -edited: range: changeInLength: метод для объекта self.textView textStorage? –

+0

Я не мог использовать диапазон, потому что другие потоки работают над текстом разметки и находят ссылку на изображение, удаляют их и вставляют изображения на место, поэтому это приведет к неправильному смещению другого диапазона! – Aryan

Смежные вопросы