Hoşgeldin. Soru sormak veya cevaplamak için hemen üye ol.
0 oy
1.2k kez görüntülendi
ios development kategorisinde tarafından
tarafından düzenlendi

http://forum.yasinturkoglu.com/800/uitextview-asenkron-resim-ekleme

Yukarıda linki olan, konuda aynı soruna değindim, çözümüz daha göz önünde olması için yeni bir konuyla yukarı taşıma gereği hissetim. Platform açısından daha yararlı olacağını düşündüm.

Tableview içinde, olan uıtextview içine asenkron olarak resim yüklemeye çalışıtığımda eğer textview ait scrool enebled check edilmemeise, muhtemelen textivew in resim yüklendikten sonraki boytu table celle ait boyutu aştığı için textview içindeki resimler görünmüyor ve table cell gerekli yüksekliğe gelmiyor.

Aşağıda linkini veridğim örnek uygulamada scrool enabled ama düzgün bir görünüm elde etmek için disabled olması gerekiyor, bu şekilde yaparsamda yukarıda bahsetiğim problem baş gösteriyor. 

Bu ve bunun dışında aklma takılan bir iki noktayı kdoların arasında yorum olarak yazdım, eğer cevaplayabilirseniz beni büyük bir derten kurtarırsınız.

Örnek app linki 

https://drive.google.com/open?id=0B4MEF11v_cH3OHZyOGtnX3JIWmM

Uygulamayı açtığınzda resimler görüntüleniyor fakat hücrelerin dikey boyutnun uıtextivew boutuna erişmesi için scrool disabled yapıp uygulamımı çalıştırdığımda, malesef resim görüntüleyemiyorum.

 

1 cevap

+1 oy
tarafından
tarafından seçilmiş
 
En İyi Cevap

verdiğiniz örnek de gereken düzenlemeleri yaptım ve mümkün olduğunca açıklamalarını yazmaya çalıştım. Çok vaktim yok fazla detaylı yazamadım. Kafanıza takılan bir yer olursa sorarsınız. Yarın yine yardımcı olmaya çalışırım.

https://drive.google.com/file/d/0B_33To7xgYO7RENwcm1kaUl3Wlk/view?usp=sharing

tarafından
tarafından düzenlendi
Öncelikle vaktinizi ayırıp ilgilendiğiniz için çok çok teşekkür ederim. Her satırı tek tek okudum :).
Aklıma ufak birşey takıldı, ben cell içindeki textviewlar kendi içinde scrool olup kulanımı zorlaştırmasın diye, dikey ölçüsünü set etiği yerde scrool enabld değerini false yaptım, şuanda tamam gibi sizce bir sorun olurmu ?

Birde ben bu textview içinde hashtag yapısı kulanmak için UITapGestureRecognizer ile tap olayı ekliyorum, bunun performansı hakında bilgim yok sizce bu örnek çalışma içinki textviewlarda UITapGestureRecognizer kulsam bu hatalı bir kulanım mı olur ?

Sizle swift'e ait birçok detay öğrendim, öğrendikçe ilk zamanlar web tarafında kullandığız dillere göre çok despot dediğim bu dili dahada sevmeye başladım. Şahane bir dil.

Bu konuda bana yardımlarınız, çok oldu bedelini ödeyemem tekrar teşekkürler.

Not: çalışırken farketim, yüksekliğin set edildiği yerde                     self.textView.scrollEnabled = false dersem, bazı celler yüklendiği sırada, view yükseklğini düzgün alamamış oluyor.     self.textView.scrollEnabled = false olacak şekilde bu işlemleri yapmanın bir imaknı olur mu ?
tarafından
rica ederim.
yardımcı olabiliyorsam ne mutlu bana. :)
textView'in yüksekliği set edildiğinde demişsiniz.
textView'in yüksekliğiyle, içeriğinin scrollEnabled = false olarak set edilmesi sırasında nasıl bir problem oluşuyor tam anlayamdım.
UITapGestureRecognizer'i textView içerisinde kullanacağınız linkleri açmak içinmi kullanmayı düşünüyorsunuz?
eğer bunun içinse hiç gerek yok, textView'in özelliklerinden biri olan dataDetectorTypes = UIDataDetectorTypes.Link olarak set ederseniz. Text'içerisinde verdiğiniz linklerin browser'da açılmasını sağlayabilirsiniz.
textView'in delegate metodlarından biri olan shouldInteractWithURL'ile tıklanan link'in text içerisindeki range değerlerini alabilirsiniz.
tarafından
tarafından düzenlendi
evet, çok yardımcı oldunuz, umarım ülkemizde sizin gibi insanların sayısı artar ve yazılım konusunda daha fazla etkimiz olur.

scrool enebled false dediğim zaman, ilk birkaç cell de resim yükleniyor. fakat aşağı doğru scrool a devam etiğimde galiba textview yüksekliğini hesaplayamadığından false olduğu için, resimleri gözükmeyen celler oluşuyor.

şu satırda false yapıyorum,
                        self.delegate.updateCellHeightAtIndex(currentCellAttribute)
                        self.textView.scrollEnabled = false


link için kulanıcam ama bunun yanından #yasin_turkoglu gibi bir hashtag verip buna tıklayıp bir olayın olmasını sağlıyıcam, bunun içinde #yasin_turkoğlu kelimesnin range değerine bir custom atrbute atıyorum tap olduğunda ilgili indexin attrbute değerini kontrol edeyorum eğer custom attrbute e sahiipse bir action gerçekleştiriyorum.

düzeltme :)

getNewContenHeight değerini getNewContenHeight+30 şeklinde fazla verdim scool olayı kapatmaya gerek olmadan iptal oldu, galiba bu scrool kapatma sorunumu çözmüş olucak. :)
tarafından
textView'in o anki içeriğine göre mevcut içerik yüksekliğini almak için kullandığımız contentSize bazen içeriğe göre tutarsızlıklar gösterebilir. Aslında contentInset değerine de bir bakıp varsa text üst, sol, alt, ve sağ yanlarında kalan boşluklarıda değerlendirmeye almak gerekir. Ben dün hızlıca yaptığım için aklıma gelmedi bu nüans.
getNewContenHeight değerine bir de contentInset'in top ve bottom değerlerini ekleyerek deneyin bakalım.
kafadan + 30 gibi bir değer de vererek bu sorun çözülebilir belki ama tam ölçülerde gereksiz boşluk bırakılması gibi bir problemede neden olacaktır.
textView'in içeriği, frame boyutlarından küçükse doğal olarak scroll gözükmeyecektir ve scrollEnabled'le de uğraşmanıza gerek kalmayacaktır tabi.

text içerisinde custom range değerlerindeki özel text'lerin tıklanabilir olması için özel bir şeyler yapmak gerekiyor. evet.
O halde tapRecognizer'i bir deneyin bakalım tam öngöremedim ben de bir problem doğurup doğurmayacağını açıkçası.
tarafından
bir sorun daha çözüme kavuştu, tekrar teşekkürler.
tarafından
bir cell içinde birden fazla image attech edilirse yüksekliği tam hesaplayamıyor.
galiba ilk resmi yüklediğinde atamayı yaptığından doğru textview ölçüsünü alamadım. :)
şuanda bir textview içindeki tüm imageların yüklenmesinin tamamlanmasından sonra bunu nasıl anlayıp yüksekliği değiştiririm ona uğraşıyorum. :D

bunun için bir fikriniz var mı, yani bir kısayol textview yüklenme işlemlerinin tamamlndığını anlamak için.

benim şuanda, textview içersindeki image sayısnı alıp son attechment ın yüklenmiş olduğunu kontrol edip bundan sonra işlem yapmak gibi bir fikrim var ama daha başaramadım, çalışıcaak mı da bilmiyorum. :D
tarafından
eğer benim verdiğim örnek üzerinden devam ediyorsanız hala. viewController'içerisinde cell ölçülerindeki değişimleri bir array içerisine attığımız delegate fonksiyonu olan updateCellHeightAtIndex içerisinde dikkat ederseniz bir kere olan değişimleri cell id'si ne göre bir kere array'a ekliyoruz. eğer aynı cellId'sin de ikinci bir değişim söz konusu olursa ilgili cellId'si bir kere o array'a eklendiği için yeni ölçüler kayıt edilmiyor.
tarafından
evet istek yapılan adreste b:  parametreisni "yazarların evcil hayvanlarının capsleri" yaptım burda bir cell içinde iki image ekleniyor, updateCellHeightAtIndex her ihtimalde, guncelleme yapmasını istedim, fakat ilk aldığı ölçü değişmiyor. bir cell için iki fonksiyon, asenkron bir şekilde aynı andan çağrıldığı için mi, bu şekilde davranıyor acaba, anlayamadım.

birkaç yöntem daha deneyip, çözümü bulmaya çalışıcam.  

başka bir örnekte, içerik yüksekliğini cell.textview.sizeThatFits(CGSize(width: self.view.frame.width .... şeklinde aldığımda daha isabetli bir sonuca ulaştım sizce bir sorun olur mu ?

tabi bu da, birden çok resimdeki yükseklik sorunumu çözemedi :D
tarafından
yüklenen iki imaj için aynı anda bir cell ölçüsü set edilmiyor. ilk yüklenen imaj updateCellHeightAtIndex'i bir kere çağrılmasına neden oluyor ve sonuçta eğer self.cellAttributeArray içerisinde ilgili cellId'si ile bir kayıt yoksa yeni bir tane oluşturuluyor. Bu durumda updateCellHeightAtIndex aynı cell'deki ikinci imaj yüklendiğinde tekrar çağırıldığında self.cellAttributeArray içerisinde daha önceki ilk imaj yüklendikten sonraki cell ölçüsü set edildiğinden güncel ölçü set edilmiyor. O nedenle benim kurduğum yapıyımı kullanmaya devam ediyorsunuz diye sordum.
bu yapıda cell ölçüsü bir kere set edildikten sonra, ikinci kere değiştirilemiyor çünkü.

eğer hala aynı yapıyı kullanıyorsanız  updateCellHeightAtIndex fonsiyonunuzu aşağıdakiyle değiştirin.

func updateCellHeightAtIndex(cellAtt:cellAttribute) {
        
        //alınan cell değerlerini bir array'a set ediyoruz. bir döngüyle eğer array'a daha önceden set edilmiş aynı id varsa pass geöiyoruz.
        var isExist:Bool = false
        for currentCellAtt in self.cellAttributeArray as [cellAttribute] {
            if currentCellAtt.cellId == cellAtt.cellId {
                myTable.beginUpdates()
                currentCellAtt.cellHeight = cellAtt.cellHeight
                myTable.endUpdates()
                isExist = true
                break
            }
        }
        if !isExist {
            myTable.beginUpdates()
            self.cellAttributeArray.append(cellAtt)
            myTable.endUpdates()
            print("cell ölçülerinde bir değişim söz konusu")
        }
        
    }
tarafından
evet bende hemen hemen sizin gibi düşnmüştüm ve aynısnı yaptığımı sanıyorum hatta şimdi dediğinizin aynısını yapştırdım fakat malesef, o problemi çözemedim :D

örnek proje linki şu
https://drive.google.com/open?id=0B4MEF11v_cH3VEt4N3BmMTNhRnc

benim tahminim şuydu yanlış düşünüyor olabilirim, af ola :D
url to image fonksiyonun iki defe çalışması gerektiği iki reismli bir cell de, (örneğimde 1 nolu cell ) bu işlem asenkron olarak aynı anda çalışıyor urlToImg(birinci resim için ) ve  ikinci resim için aynı anda, bu yuzden değişkeleride bir resim yüklendiğinde set ediyor.
diye düşündüm, tabi siz daha iyi bilirsiniz yanlış düşünüyor olabilirim. :)

teşekkürler
tarafından
ahaha pardon ya, en son verdiğim örnek'de updateCellHeightAtIndex içerisinde daha sonradan bir ekleme daha yapmıştım onu görmediniz tabi. pardon.

yeni cell ölüçüsünü currentCellAtt.cellHeight'e set ederken beginUpdates ve end updates'le wrap ediyoruz.

en son hali yukarıda, onu kullanın. denedim gönderdiğiniz proje üzerinde. çalışıyor.
tarafından
tarafından düzenlendi
anladımm,şahane oldu :) çok özür dileyerek kısa birşey daha sormak istiyorum unutmuşum.

sayfayı çok hızlı scrool etiğimde (en aşağı veya hızlıca yukarı)

self.delegate.updateCellHeightAtIndex(currentCellAttribute)

fonksiyon çağrıldığı sırada nesnesi tanımlanamamış oluyor, ve unexpectedly found nil while unwrapping an Optional value hatası alıyorum bu tanımlamayı if .... {  } blogu içinde bile yapsam gene hızlı scroolarda bu hatayı alabiliyorum.

bunun nasıl önüne geçebilirim.
tarafından
işte işler şimdi karıştı. :)

dün hızlıca bakmamdan dolayı gözden kaçırdığım bir sürü hata su yüzüne çıktı teker teker.
yapı çok yanlış.

öncelikle,
unexpectedly found nil hatasını almanızın nedeni.
viewController'da tableView delegate metodu olan cellForRowAtIndexPath için benim gözden kaçırdığım bir detay.

tableView.dequeueReusableCellWithIdentifier("tableCell", forIndexPath: indexPath) as? tableCell

kullanmak yerine,

tableView.dequeueReusableCellWithIdentifier("tableCell") as? tableCell

kullanmışım.

bu performans problemlerine ve delegate metodunun çağrılması sırasında yukarıdaki hataya neden oluyor.
bu hatayı fark edip düzelttikten sonra, yukarıdaki problem düzeldi. fakat bu defada cell'lerin içerisindeki veri ve imajların scroll edildikçe yeniden ve yeniden defalarca yüklendiğini fark ettim ki, bunun nedeni sizin tüm bu requestlerinizi, link imaj çevrimlerinizi custom cell class'ı içerisinde gerçekleştiriyor olmanız.

bu işlem viewController'da yapılmalı ve bir array'a aktarılmalı, bu sayede ilgili index'de bulunan tableViewCell scroll edildiğinde daha önce oluşturulmuş veri ilgili cell'in textView'ine yazılabilsin.

şu an tüm bu işlemler cell'ler görünür alana girdikleri anda gereksiz bir şekilde defalarca
tekrarlanıyorlar.
tarafından
anladım, ben bir örnekle daha çalışıyorum, uygulamanın bütün hali orada.
cell içersinde haneke kütüphanesinin tekrar yüklenmesini istemediğim için, zaten protocol mantığından uzak durup viewcontroller içinde yapmaya başlamıştım. Bunun farkına  varmamı sağladınız, tekrar teşekkür ederim.

Uygulamamı üyelerimize duyurduğumda, platformunuzun insanlara yardımından bahsetmeyi ihmal etmiyeceğim. Umarım burayı daha fazla insan ziyaret eder.
Yazılım üstüne böyle bilgi dolu platformların olması, geliceğimiz için ümit veriyor.
tarafından
teşekkürler.
lütfen siz de ios konularında edindiğiniz tecrübelerinizle buraya katkınızı esirgemeyin. :)
...