2017-01-17 21 views
2

そこには同様の質問がいくつかありますが、私は、Swift3を使ってiOS 10を最新の状態にしておくべきだと思います。プライベートAPIは使用せず、依存しませんあなたのアイコンをユニコードの絵文字に制限します。アイコンとテキストを含むUITableViewRowAction

私は今3つのアクションを持つテーブルの行があります。

func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? { 
    let rename = UITableViewRowAction(style: .normal, title: "Rename") { (_, indexPath) in 
     self.renameEntry(indexPath) 
    } 
    let locate = UITableViewRowAction(style: .normal, title: "Locate") { (_, indexPath) in 
     self.locateEntry(indexPath) 
    } 
    locate.backgroundEffect = UIVisualEffect() 
    let delete = UITableViewRowAction(style: .default, title: "Forget") { (_, indexPath) in 
     self.deleteEntry(indexPath) 
    } 
    return [delete, locate, rename] 
} 

enter image description here

しかし、その代わりのない私が選んだのサイズとスタイルの中心にテキスト、私が欲しいとの色の正方形:

enter image description here

私はbackgroundColorを使ってみましたが、ボタンの上に画像を並べるだけでしたが、テキストの位置や色を変更しないでください。だから、これ以上の何かでなければならない。

theAction.backgroundColor = UIColor(patternImage: UIImage(named: "renameImage")!) 

良い方法がありますか?

答えて

1

私がやり遂げたのは、その場でイメージをバックグラウンドとして生成することでした。これには、ハック/巧妙なトリックまたは2つの使用が必要でした。

func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? { 

    let stockWidth = String(repeating: " ", count: 8) 
    let rename = UITableViewRowAction(style: .normal, title: stockWidth) { (_, indexPath) in 
     self.renameEntry(indexPath) 
    } 
    self.fixAction(rename, text: "Rename", image: UIImage(named: "pencilEdit")!, color: UIColor(52, 61, 70)) 
    let locate = UITableViewRowAction(style: .normal, title: stockWidth) { (_, indexPath) in 
     self.locateEntry(indexPath) 
    } 
    self.fixAction(locate, text: "Locate", image: UIImage(named: "locatePin")!, color: UIColor(38, 107, 215)) 
    let delete = UITableViewRowAction(style: .normal, title: stockWidth) { (_, indexPath) in 
     self.deleteEntry(indexPath) 
    } 
    self.fixAction(delete, text: "Forget", image: UIImage(named: "triggerDeleteSelector")!, color: UIColor(227, 34, 60)) 
    let gap = UITableViewRowAction(style: .normal, title: "") { (_, _) in 
     // pass 
    } 
    gap.backgroundColor = UIColor.clear 
    return [gap, delete, locate, rename] 
} 

2つの明白ではないの詳細があります:

最初の部分は、標準的なデリゲートメソッドです。まず、渡されたテキスト文字列からその幅を派生させます。表示されない空白文字を使って幅を指定しなかった場合、背景画像には描画される領域がありません。 stockWidth最初の3つのアクションで使用される文字列。 8文字の幅は、背景画像を生成するfixActionメソッドによって共有されます。

第2の詳細は、下部に4番目の「ギャップ」アクションを含めることです。何らかの理由で、最初のアクションにタイルパターンである背景ペイントがある場合、他のアクションの下で左に伸びます。私は、これを避けるために正面にこのゼロ幅のopアクションを挿入しなければならないことがわかりました。

func fixAction(_ action:UITableViewRowAction, text:String, image:UIImage, color:UIColor) { 
    // make sure the image is a mask that we can color with the passed color 
    let mask = image.withRenderingMode(.alwaysTemplate) 
    // compute the anticipated width of that non empty string 
    let stockSize = action.title!.sizeWithAttributes([NSFontAttributeName: UIFont.systemFont(ofSize: 18)]) 
    // I know my row height 
    let height:CGFloat = 70 
    // Standard action width computation seems to add 15px on either side of the text 
    let width = (stockSize.width + 30).ceiling 
    let actionSize = CGSize(width: width, height: height) 
    // lets draw an image of actionSize 
    UIGraphicsBeginImageContextWithOptions(actionSize, false, 0.0) 
    if let context = UIGraphicsGetCurrentContext() { 
     context.clear(CGRect(origin: .zero, size: actionSize)) 
    } 
    color.set() 
    let attributes = [NSForegroundColorAttributeName: color, NSFontAttributeName: UIFont(name: "Avenir-Book", size: 13)] 
    let textSize = text.size(attributes: attributes) 
    // implementation of `half` extension left up to the student 
    let textPoint = CGPoint(x: (width - textSize.width).half, y: (height - (textSize.height * 3)).half + (textSize.height * 2)) 
    text.draw(at: textPoint, withAttributes: attributes) 
    let maskHeight = textSize.height * 2 
    let maskRect = CGRect(x: (width - maskHeight).half, y: textPoint.y - maskHeight, width: maskHeight, height: maskHeight) 
    mask.draw(in: maskRect) 
    if let result = UIGraphicsGetImageFromCurrentImageContext() { 
     // adjust the passed in action's backgroundColor to a patternImage 
     action.backgroundColor = UIColor(patternImage: result) 
    } 
    else { 
     "WTH!!!".logError() 
    } 
    UIGraphicsEndImageContext() 
} 
1

自動レイアウトのメリットを失いたくなく、良質のUIを実現したくない場合は、スワイプジェスチャーをセルと3つのカスタムビューで実装することをお勧めします。 パターンイメージからUIColorで遊んで、背景として設定することも可能ですhttps://developer.apple.com/reference/uikit/uicolor/1621933-init しかし、アイコンとテキストを画像にレンダリングしておく必要があります。画像が伸びる可能性があります。