垂直居中UITextField的attributionPlaceholder

时间:2015-02-23 15:42:53

标签: ios objective-c iphone

我目前无法在UITextField中垂直对齐一个attributionPlaceholder,我不知道为什么。

这就是我正在做的事情:

self.addressBar = [[UITextField alloc] initWithFrame: CGRectMake(...)];
self.addressBar.backgroundColor = [UIColor whiteColor];
self.addressBar.attributedPlaceholder = [[NSAttributedString alloc] initWithString:@"Placeholder text"
                                attributes:@{
                                             NSForegroundColorAttributeName: [UIColor colorWithRed:79/255.0f green:79/255.0f blue:79/255.0f alpha:0.5f],
                                             NSFontAttributeName : [UIFont fontWithName:@"Gotham-BookItalic" size:14.0],
                                             }
 ];
self.addressBar.delegate = self;
self.addressBar.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
[self.view addSubview:self.addressBar];

以下是发生的事情:

The UITextFieldLabel is smaller than its parent

很明显,这是因为UITextFieldLabel的高度比UItextField本身小10px,但我似乎无法改变这种情况。

这只发生在使用attributionPlaceholder时;默认的占位符属性可以正常工作。

有什么想法吗?

4 个答案:

答案 0 :(得分:17)

使用NSParagraphStyle增加最小行高:

NSMutableParagraphStyle *style = [self.addressBar.defaultTextAttributes[NSParagraphStyleAttributeName] mutableCopy];
style.minimumLineHeight = self.addressBar.font.lineHeight - (self.addressBar.font.lineHeight - [UIFont fontWithName:@"Gotham-BookItalic" size:14.0].lineHeight) / 2.0;

self.addressBar.attributedPlaceholder = [[NSAttributedString alloc] initWithString:@"Placeholder text"
                            attributes:@{
                                         NSForegroundColorAttributeName: [UIColor colorWithRed:79/255.0f green:79/255.0f blue:79/255.0f alpha:0.5f],
                                         NSFontAttributeName : [UIFont fontWithName:@"Gotham-BookItalic" size:14.0],
                                         NSParagraphStyleAttributeName : style
                                         }
 ];

您还可以覆盖- (CGRect)placeholderRectForBounds:(CGRect)bounds;子类中的UITextField方法。

它很乱,但它有效:)

答案 1 :(得分:2)

如果您的文本字段的文本字体与文本字段的占位符字体不同,则占位符将不会对齐。如果你想要正确对齐,请确保字体相同,否则你可以按照kean的回答。

    textField.font = [UIFont fontWithName:@"HelveticaNeue" size:12];
    textField.attributedPlaceholder =
    [[NSAttributedString alloc] initWithString:@"Enter fruit/vegetable name"
                                                                           attributes:@{
                                                                                            NSFontAttributeName : [UIFont fontWithName:@"HelveticaNeue" size:12.0]
                                                                                        }
     ];

答案 2 :(得分:1)

如果您使用的是originPlaceholder,请确保将textField的字体设置为您在referencedString中使用的字体。

答案 3 :(得分:1)

@Kean回答。您应该在Swift 4中这样做:

import UIKit
import ARKit

//-------------------------
//MARK: - ARSCNViewDelegate
//-------------------------

extension ViewController: ARSCNViewDelegate {

    func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {

        //1. Check We Have An ARImageAnchor, Then Get It's Reference Image & Name
        guard let imageAnchor = anchor as? ARImageAnchor else { return }

        let detectedTarget = imageAnchor.referenceImage

        guard let detectedTargetName = detectedTarget.name  else { return }

        //2. If We Have Detected Our Virtual Menu Then Add The CakeOnePlane
        if detectedTargetName == "cakeMenu" {

            let cakeOnePlaneGeometry = SCNPlane(width: 0.045, height: 0.045)
            cakeOnePlaneGeometry.firstMaterial?.diffuse.contents = UIColor.cyan
            cakeOnePlaneGeometry.cornerRadius = 0.01

            let cakeOnPlaneNode = SCNNode(geometry: cakeOnePlaneGeometry)
            cakeOnPlaneNode.eulerAngles.x = -.pi/2

            //3. To Allow Us To Easily Keep Track Our Our Currently Added Node We Will Assign It A Unique Name
            cakeOnPlaneNode.name = "Strawberry Cake"

            node.addChildNode(cakeOnPlaneNode)
            cakeOnPlaneNode.runAction(SCNAction.moveBy(x: 0.15, y: 0, z: 0, duration: 0.75))


        }
    }
}

class ViewController: UIViewController {

    @IBOutlet var augmentedRealityView: ARSCNView!
    let augmentedRealitySession = ARSession()
    let configuration = ARWorldTrackingConfiguration()

    //------------------
    //MARK: - Life Cycle
    //------------------

    override func viewDidLoad() {
        super.viewDidLoad()

        setupARSession()
    }


    //-----------------
    //MARK: - ARSession
    //-----------------

    /// Runs The ARSession
    func setupARSession(){

        //1. Load Our Detection Images
        guard let detectionImages = ARReferenceImage.referenceImages(inGroupNamed: "AR Resources", bundle: nil) else { return }

        //2. Configure & Run Our ARSession
        augmentedRealityView.session = augmentedRealitySession
        augmentedRealityView.delegate = self
        configuration.detectionImages = detectionImages
        augmentedRealitySession.run(configuration, options: [.resetTracking, .removeExistingAnchors])

    }

    //--------------------
    //MARK: - Interaction
    //--------------------

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

        //1. Get The Current Touch Location & Perform An ARSCNHitTest To Check For Any Hit SCNNode's
        guard let currentTouchLocation = touches.first?.location(in: self.augmentedRealityView),
             let hitTestNode = self.augmentedRealityView.hitTest(currentTouchLocation, options: nil).first?.node else { return }

        //2. If We Have Hit Our Strawberry Cake Then We Call Our makeCakeOnNode Function
        if let cakeID = hitTestNode.name, cakeID == "Strawberry Cake"{

            makeCakeOnNode(hitTestNode)

        }
    }


    /// Adds An SCNPlane To A Detected Cake Target
    ///
    /// - Parameter node: SCNNode
    func makeCakeOnNode(_ node: SCNNode){

        let planeGeometry = SCNPlane(width: 0.15  , height: 0.15)
        planeGeometry.firstMaterial?.diffuse.contents = UIColor.black.withAlphaComponent(0.75)

        let planeNode = SCNNode(geometry: planeGeometry)
        planeNode.position = SCNVector3(0, 0, 0.001)
        planeNode.runAction(SCNAction.moveBy(x: 0.21, y: 0, z: 0, duration: 0))
        node.addChildNode(planeNode)

    }
}

这可在iOS 10,iOS 11中解决此问题。