12

iOS 7 を使用していますが、中央に配置されているラベルをビューの左側に移動しようとしています。現在、UILabel の配置方法を変更することでこれを実行しようとしており、その過程でアニメーション化しようとしています。私は現在、次のように呼んでいます:

[UIView animateWithDuration:0.5
                 animations:^{
                      self.monthLabel.textAlignment = NSTextAlignmentLeft;
                 } completion:nil];

しかし、これはラベルを新しい配置にジャンプするだけです。これをアニメーション化する方法、またはこれを実現するためにラベルを調整するより良い方法はありますか?

4

5 に答える 5

10

テキストが正確に含まれるように UILabel フレーム サイズを設定し、UILabel をビューの中央に配置します。

self.monthLabel.text = @"February";
[self.monthLabel sizeToFit];
self.monthLabel.center = parentView.center; // You may need to adjust the y position

次に、余分なスペースがないため、レイアウトに影響を与えないように配置を設定します。

self.monthLabel.textAlignment = NSTextAlignmentLeft;

次に、UILabel フレーム サイズをアニメーション化して、必要な場所にスライドさせます。

[UIView animateWithDuration:0.5
             animations:^{
                  CGRect frame = self.monthLabel.frame;
                  frame.origin.x = 10;
                  self.monthLabel.frame = frame;
             } completion:nil];
于 2013-10-08T15:18:08.467 に答える
1

textAlignment ではなく、FRAME をアニメーション化できます。

フレームの「パディング」を取り除きたい場合は、ラベルで [UILabel sizeToFit] を実行してから、アニメーション ブロックでフレームをアニメーション化して、必要に応じて移動できます。

CGRect frameLabel = self.monthLabel.frame;

[UIView animateWithDuration:0.5
                 animations:^{
                      frameLabel.origin.x -= 100;          // e.g. move it left by 100
                      self.monthLabel.frame = frameLabel;
                 } completion:nil];
于 2013-10-08T15:14:19.327 に答える
0

ラベル フレームをアニメーション化するだけです。ここに完了ブロックがあるので、フレームを再度変更する必要があります。そしてループを進めます。

[UIView animateWithDuration:0.5
                 animations:^{
                      // Change the frame
                 } completion:^{[UIView animateWithDuration:0.5
                 animations:^{
                      // Change the frame
                 } completion:^{
                     // repeat the proccess
}]

}];
于 2013-10-08T15:16:07.667 に答える
0

これは私によく役立っています

import Foundation
import UIKit


class AnimatableMultilineLabel: UIView {

    enum Alignment {
        case left
        case right
    }

    public var textAlignment: Alignment = .left {
        didSet {
            layout()
        }
    }

    public var font: UIFont? = nil {
        didSet {
            setNeedsLayout()
        }
    }

    public var textColor: UIColor? = nil {
        didSet {
            setNeedsLayout()
        }
    }

    public var lines: [String] = [] {
        didSet {
            for label in labels {
                label.removeFromSuperview()
            }
            labels = []
            setNeedsLayout()
        }
    }

    private var labels: [UILabel] = []

    override init(frame: CGRect) {
        super.init(frame: frame)
        setup()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        setup()
    }

    private func setup() {
        isUserInteractionEnabled = false
    }

    override func layoutSubviews() {
        super.layoutSubviews()

        layout()
    }

    private func layout() {

        autocreateLabels()

        var yPosition: CGFloat = 0.0
        for label in labels {
            let size = label.sizeThatFits(bounds.size)
            let minX = textAlignment == .left ? 0.0 : bounds.width - size.width
            let frame = CGRect(x: minX, y: yPosition, width: size.width, height: size.height)
            label.frame = frame
            yPosition = frame.maxY
        }
    }

    private func autocreateLabels() {
        if labels.count != lines.count {
            for text in lines {
                let label = UILabel()
                label.font = font
                label.textColor = textColor
                label.text = text
                addSubview(label)
                labels.append(label)
            }
        }
    }

    override func sizeThatFits(_ size: CGSize) -> CGSize {
        autocreateLabels()

        var height: CGFloat = 0.0
        for label in labels {
            height = label.sizeThatFits(size).height
        }
        return CGSize(width: size.width, height: height)
    }
}

次に、できるはずです

UIView.animate(withDuration: 0.5, animations: {
    multilineLabel.textAlignment = .right
})
于 2017-12-18T14:53:16.970 に答える