0

tableView のセルで、次の Swift コードを使用してグラデーションを定義しようとしています。

func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {

    var cell:UITableViewCell = self.tableView?.dequeueReusableCellWithIdentifier("cell") as UITableViewCell
    cell.backgroundColor=UIColor.clearColor()
    let gradient : CAGradientLayer = CAGradientLayer()
    var arrayColors:Array<AnyObject> = [UIColor.blackColor().CGColor, UIColor.whiteColor().CGColor]
    gradient.colors=arrayColors
    gradient.frame = cell.bounds
    cell.layer.insertSublayer(gradient, atIndex: UInt32(indexPath.row))

    return cell
 }

ビューが最初に読み込まれると、すべてのセルの背景が白くなります。また、上下にスクロールすると、一部のコンテンツのセルが消え (タイトルとサブタイトル)、グラデーションが最終的にこれらのセルに表示されます (ランダムに、他の一部のセルは白い背景のままになります)。このキャストに関連しています - > UInt32(indexPath.row) ?

4

3 に答える 3

1

グラデーションは視覚的な装飾です。これは細胞クラスに固有です。細胞がどのように見えるかは、細胞の責任です。次に、セルクラスで定義する必要があります。これは、正しい行に正しいセルを選択することのみを目的とする cellForRowAtIndexPath には絶対に属しません。しかし、そのメソッドでセルの内部を構成しているため、これがキューイングの仕組みと組み合わされて、すべての問題が発生します。

1)UITableViewCellのサブクラスを作成します(プログラム的には、IB ..それは実際には問題ではありません)

2) awakeFromNib または layoutSubviews のレイヤーを backroundView プロパティに追加します。

3) tableViewController の viewDidLoad にセルを登録します。

于 2015-03-03T16:39:47.617 に答える
0

同様の問題がありました。私の間違いは、セルに直接グラデーションを持つ新しいレイヤーを挿入することでした。新しいレイヤーをbackgroundViewに挿入してみてください。

let gradient = CAGradientLayer()
// layer setup...
cell.backgroundView = UIView()
cell.backgroundView?.layer.insertSublayer(gradientLayer, atIndex: 0)

お役に立てれば。

于 2015-02-11T17:33:20.387 に答える
0

さらに広がるアールグレイ、ヒドラアンサー、

特定のビューにグラデーションを追加するときは、グラデーション レイヤーの実際のフレームを設定する必要があります。

最初にビューにロードされたグラデーションレイヤーを追加したビューがロードされた場合、それを配置する必要があります。その後、期待どおりにサイズ変更されません。この問題は2つの方法で解決できます。

最初 : ビューのサイズを計算して手動でフレームを指定しますが、幅と高さの比率を計算できる iPhone のバリエーションごとに計算する必要があるため、これは非常に多忙です。

 let bounds = UIScreen.main.bounds
 let deviceheight = bounds.size.height
 let deviceWidth = bounds.size.width

次に、幅のサイズを計算して指定します

ビューがロードされた後にレイヤーを追加するだけで計算を行わずにそれを行うことができる別の方法は、次の方法で実行できます。

 override func viewDidAppear(_ animated: Bool) {
    Your gradient code //you can create a method for adding a gradient layer 
}

現在、Tableview またはコレクション ビューに同じ問題が存在し、セルにメソッドが表示されたビューはありません。これには 2 つのシナリオがあります。

  1. データは静的です。
  2. データはサーバーから来ています

データが静的な場合の最初のシナリオになると、ブール型の変数を作成し、ビューが読み込まれるまで false にする必要があります。次に、ビューでそれを真にして、インデックスメソッドで行のメソッドを表示し、セルを再度リロードします。

class VC: UIViewController {


var isCellLoaded : Bool = false

override func viewDidAppear(_ animated: Bool) {

    isCellLoaded = true
    self.aTable.reloadData()
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {



    let cell = tableView.dequeueReusableCell(withIdentifier: "youcellidentifier", for: indexPath) as! youcell 
    if isCellLoaded {
        cell.gradientView.setGradient(cornerRadius: 5, gradientLeftColor: .notificationViewLeftColor, gradientRightColor: .notificationViewRightColor)
        if let gradient = cell.gradientView.layer.sublayers?[0] as? CAGradientLayer {
            gradient.frame = cell.gradientView.bounds
        }
    }

    return cell
}

データが API から来ている場合の 2 番目のシナリオに進みます

万歳!! APIが応答を返さないまで初めてデータがなく、応答が来たらデータをリロードする必要があるため、何もする必要はありません。そして物事は完璧に機能します。引用符

于 2019-12-17T06:33:29.300 に答える