2017-05-01 124 views
1

有沒有辦法在滑動手勢上更改一段文本?當用戶在段落上滑動時,我想用另一個預定義段落更改段落。IOS 10 xcode 8 swift 3,UITextView在滑動時更改文本

我被困在檢測段落,我們可以插入隱藏標籤或其他東西來檢測段落的手勢?

我可以得到字符的索引,但我怎樣才能得到段落對象或方式?

override func viewDidLoad() 
{ 
    super.viewDidLoad() 

    // set delegate for text view 
    self.textView.delegate = self 

    // set the swipeGesture to the UITextView 
    let swipe = UISwipeGestureRecognizer(target: self, action: #selector(self.swipeOnce(_:))) 
    swipe.delegate = self 
    swipe.direction = UISwipeGestureRecognizerDirection.left 
    self.textView.addGestureRecognizer(swipe) 

    // data 
    var arrString = [String]() 

    arrString.append("\n"+"5 Comme quelques-uns parlaient du temple, qui était orné de belles pierres et d'objets apportés en offrandes, Jésus dit:") 
    arrString.append("\n"+"6 «Les jours viendront où il ne restera pas pierre sur pierre de ce que vous voyez, tout sera détruit.»") 
    arrString.append("\n"+"7 Ils lui demandèrent: «Maître, quand donc cela arrivera-t-il et à quel signe reconnaîtra-t-on que ces événements vont se produire?»") 
    arrString.append("\n"+"8 Jésus répondit: «Faites bien attention à ne pas vous laisser égarer. En effet, beaucoup viendront sous mon nom en disant:'C'est moi', et:'Le moment est arrivé.'Ne les suivez pas.") 
    arrString.append("\n"+"9 Quand vous entendrez parler de guerres et de soulèvements, ne vous laissez pas effrayer, car il faut que ces choses arrivent d'abord. Cependant, ce ne sera pas encore la fin.»") 
    arrString.append("\n"+"10 Puis il leur dit: «Une nation se dressera contre une nation et un royaume contre un royaume;") 
    arrString.append("\n"+"11 il y aura de grands tremblements de terre en divers endroits, ainsi que des pestes et des famines; il y aura des phénomènes terrifiants et de grands signes dans le ciel.") 
    arrString.append("\n"+"12 Mais, avant tout cela, on mettra la main sur vous et l'on vous persécutera, on vous livrera aux synagogues, on vous jettera en prison, on vous traînera devant des rois et devant des gouverneurs à cause de mon nom.") 

    // set font 
    let font = UIFont(name: "SourceSansPro-Regular", size: 20) 
    let textFont = [NSFontAttributeName:font] 

    let concat = NSMutableAttributedString() 

    // set the paragraphe 
    let count = arrString.count-1 

    for x in 0...count { 

     // Create a string that will be our paragraph 
     let para = NSMutableAttributedString() 

     // Create locally formatted strings 
     let attrString = NSAttributedString(string: arrString[x], attributes:(textFont as Any as! [String : Any])) 


     para.append(attrString) 

     // Define paragraph styling 
     let paraStyle = NSMutableParagraphStyle() 
     //paraStyle.firstLineHeadIndent = 15.0 
     //paraStyle.paragraphSpacingBefore = 10.0 
     paraStyle.lineSpacing = 5 

     // Apply paragraph styles to paragraph 
     para.addAttribute(NSParagraphStyleAttributeName, value: paraStyle, range: NSRange(location: 0,length: para.length)) 

     // concat paragraphe 
     concat.append(para) 

    } 

    // assign para 
    textView.attributedText = concat 
} 

func swipeOnce(_ gestureRecognizer: UITapGestureRecognizer) 
{ 
    // Get the location of the gesture recogniser in the text view 
    let point:CGPoint = gestureRecognizer.location(in: self.textView) 

    // Get the character index of the swipe 
    let index:Int = self.textView.layoutManager.characterIndex(for: point, in: self.textView.textContainer, fractionOfDistanceBetweenInsertionPoints: nil) 

    print(index); 
} 

謝謝。

+0

使您的字符串數組成爲類屬性,以便您可以從滑動手勢識別器的操作方法訪問它。 – nathan

回答

1

你是問題的是面向對象的編程,而不是Swift或UIKit API的任何東西。

這裏是一個可能的解決方案的總體結構:

1:聲明一個類屬性數據。

var arrString: [String] { 
    var arrString = [String]() 
    arrString.append("\n"+"5 Comme quelques-uns parlaient du temple, qui était orné de belles pierres et d'objets apportés en offrandes, Jésus dit:") 
    arrString.append("\n"+"6 «Les jours viendront où il ne restera pas pierre sur pierre de ce que vous voyez, tout sera détruit.»") 
    arrString.append("\n"+"7 Ils lui demandèrent: «Maître, quand donc cela arrivera-t-il et à quel signe reconnaîtra-t-on que ces événements vont se produire?»") 
    arrString.append("\n"+"8 Jésus répondit: «Faites bien attention à ne pas vous laisser égarer. En effet, beaucoup viendront sous mon nom en disant:'C'est moi', et:'Le moment est arrivé.'Ne les suivez pas.") 
    arrString.append("\n"+"9 Quand vous entendrez parler de guerres et de soulèvements, ne vous laissez pas effrayer, car il faut que ces choses arrivent d'abord. Cependant, ce ne sera pas encore la fin.»") 
    arrString.append("\n"+"10 Puis il leur dit: «Une nation se dressera contre une nation et un royaume contre un royaume;") 
    arrString.append("\n"+"11 il y aura de grands tremblements de terre en divers endroits, ainsi que des pestes et des famines; il y aura des phénomènes terrifiants et de grands signes dans le ciel.") 
    arrString.append("\n"+"12 Mais, avant tout cela, on mettra la main sur vous et l'on vous persécutera, on vous livrera aux synagogues, on vous jettera en prison, on vous traînera devant des rois et devant des gouverneurs à cause de mon nom.") 
    return arrString 
} 

這將允許數據在類中的任何地方被訪問。

2:創建另一個屬性以跟蹤當前段落。

var paragraphIndex = 0 

3:修改輕掃手勢識別的行動來更新文本視圖中的文本。

func swipeOnce(_ gestureRecognizer: UISwipeGestureRecognizer) { 
    paragraphIndex += 1 
    if paragraphIndex > arrString.count - 1 { return } 
    textView.text = arrString[paragraphIndex] 
} 

這將增加該段跟蹤,檢查,以確保它是一個有效的索引,並替換文本視圖中的文本。

這不是最理想或最乾淨的解決方案,但需要最少數量的當前代碼和工作解決方案之間的更改。

+0

感謝您的時間,但也許我不會正確表達自己,或者我不明白您的代碼,但我的需要是ex:文本5到12通過viewDidLoad()基金顯示在iPhone屏幕上,而我在文本9上滑動,我想用swipeOnce func,檢測到我滑過文本9,並最終替換文本。 :P –

+0

所以只需使用多個UITextViews,每個段落一個。在每個文本視圖上使用滑動手勢識別器。 – nathan

+0

哇,這是一個好主意! –

相關問題