Координация смайлика в портретном режиме не работает должным образом

Я новичок в Swift и в настоящее время слежу за скринкастами из CS193P. В одном из эпизодов показано, как создать смайлик с помощью drawRect. Я пытался воспроизвести это, но оказалось, что это не очень хорошо работает. В оригинальном скринкасте это выглядит так же, как взорванный смайлик, но в моем упражнении мое выглядит следующим образом;

введите здесь описание изображения

Хотя, кажется, работает в ландшафтном режиме.

введите здесь описание изображения

Мой код выглядит следующим образом, и не могли бы вы указать мне, какие части неверны ???

import UIKit

class FaceView: UIView {

    var faceCenter: CGPoint {
        return convertPoint(center, fromView:superview)
    }

    var scale:CGFloat {
        return 0.9
    }

    private struct Scaling {
        static let FaceRadiusToEyeRadiusRatio: CGFloat = 10
        static let FaceRadiusToEyeOffsetRatio: CGFloat = 3
        static let FaceRadiusToEyeSeperationRatio: CGFloat = 1.5
        static let FaceRadiusToMouthWidthRatio: CGFloat = 1
        static let FaceRadiusToMouthHeightRatio: CGFloat = 3
        static let FaceRadiusToMouthOffsetRatio: CGFloat = 3

    }

    private enum eye {case Left, Right}

    private func bezierPathForEye(whichEye: eye) -> UIBezierPath {

        let eyeRadius = faceRadius / Scaling.FaceRadiusToEyeRadiusRatio
        let eyeVerticalOffset = faceRadius / Scaling.FaceRadiusToEyeOffsetRatio
        let eyeHorizontalSeparation = faceRadius / Scaling.FaceRadiusToEyeSeperationRatio

        var eyeCenter = faceCenter
        eyeCenter.y = eyeVerticalOffset
        switch whichEye {
        case .Left: eyeCenter.x -= eyeHorizontalSeparation / 2
        case .Right: eyeCenter.x += eyeHorizontalSeparation / 2
        }

        let path = UIBezierPath(arcCenter: eyeCenter, radius: eyeRadius, startAngle: 0, endAngle: CGFloat(2*M_PI), clockwise: true)
        path.lineWidth = lineWidth;
        return path

    }

    private func bezierPathForSmile(fractionOfMaxSmile: Double) -> UIBezierPath {

        let mouthWidth = faceRadius / Scaling.FaceRadiusToMouthWidthRatio
        let mouthHeight = faceRadius / Scaling.FaceRadiusToMouthHeightRatio
        let mouthVerticalOffset = faceRadius / Scaling.FaceRadiusToMouthOffsetRatio

        let smileHeight = CGFloat(max(min(fractionOfMaxSmile,1),-1)) * mouthHeight

        let start = CGPoint(x:faceCenter.x - mouthWidth / 2 , y:faceCenter.y + mouthVerticalOffset)
        let end = CGPoint(x:start.x + mouthWidth, y: start.y)
        let cp1 = CGPoint(x:start.x + mouthWidth / 3, y: start.y + smileHeight)
        let cp2 = CGPoint(x:end.x - mouthWidth/3, y:cp1.y)
        let path = UIBezierPath()
        path.moveToPoint(start)
        path.addCurveToPoint(end, controlPoint1: cp1, controlPoint2: cp2)
        path.lineWidth = lineWidth

        return path


    }




    var faceRadius: CGFloat {
        return min(bounds.size.width,bounds.size.height) / 2 * scale
    }

    var lineWidth: CGFloat = 3 { didSet { setNeedsDisplay() } }
    var color: UIColor = UIColor.blueColor() { didSet { setNeedsDisplay() } }


    override func drawRect(rect: CGRect) {

        let facePath = UIBezierPath(arcCenter: faceCenter, radius: faceRadius, startAngle: 0, endAngle: CGFloat(2*M_PI), clockwise: true)

        facePath.lineWidth = 3
        color.set()
        facePath.stroke()

        bezierPathForEye(.Left).stroke()
        bezierPathForEye(.Right).stroke()

        let smiliness = 0.75
        let smilepath = bezierPathForSmile(smiliness)
        smilepath.stroke()
    }

}

К вашему сведению, это не задание, и я просто пытаюсь воспроизвести что-то для тренировок.


person Naing Lin Aung    schedule 19.02.2015    source источник


Ответы (1)


Меняться от

eyeCenter.y = eyeVerticalOffset

в это

eyeCenter.y -= eyeVerticalOffset
person TonyMkenu    schedule 19.02.2015