2016-06-23 4 views
4

CGSize 개체를 서버에 보내야합니다. 서버에 보낼 수있는 최대 크기는 900 * 900 (900 폭/900 높이)입니다.가로 세로 비율을 유지하면서 CGSize의 최대 크기를 조정하십시오.

900 * 900보다 큰 일부 오브젝트가 있는데, 최대 크기 (이미 말한대로 최대 900 * 900)의 크기를 조정하지만 가로 세로 비율을 유지하는 기능을 작성하고 싶습니다.

예를 들어, 너비가 1,000px, 높이가 1,000px 인 객체가있는 경우 함수가 900 * 900 객체를 반환하도록합니다. 너비가 1920px이고 높이가 1080px 인 객체가 있으면 비율을 유지하면서 가능한 최대 크기를 반환하고 싶습니다.

누구나 어떻게 할 수 있습니까?

감사합니다.

OriginalUser2의 대답은 :

let aspect = CGSizeMake(900, 900) 
let rect = CGRectMake(0, 0, 1920, 1080) 

let final = AVMakeRectWithAspectRatioInsideRect(aspect, rect) 

finalx = 420, 어쨌든 1080*1080가 같은 화면 비율에없는 이유를 이해할 수 없다, {x 420 y 0 w 1,080 h 1,080}입니다 :

이 코드를 시도했습니다 1920*1080으로 표시되며 900*900보다 큽니다.

좀 더 설명 할 수 있습니까?

+1

는 [ 'AVMakeRectWithAspectRatioInsideRect']에서보세요 (https://developer.apple .com/library/ios/documentation/AVFoundation/Reference/AVFoundation_Functions/# // apple_ref/c/func/AVMakeRectWithAspectRatioInsideRect) – Hamish

+0

@ originaluser2 최대 크기를 얻기 위해'CGRect '에 맞출 필요가 없다. –

+0

물론 원점에 대해서'CGPointZero'를 넘겨 주면 크기를 알 수 있습니다. – Hamish

답변

4

제 의견에 말했듯이, AVFounation 프레임 워크의 AVMakeRectWithAspectRatioInsideRect 함수를 사용하여이 작업을 수행 할 수 있습니다.

코드에 문제가있는 것은 값의 방향이 잘못되었습니다. boundingRect: 매개 변수는 너비가 -에 해당하는 rect이어야하며 aspectRatio:은 가로 세로 비율을 유지하면서 크기를 조정할 원본 크기 여야합니다. 예를 들어

:

import AVFoundation 

// original size 
let aspect = CGSize(width: 1920, height: 1080) 

// rect to fit that size within, while maintaining its aspect ratio, 
// in this case you don't care about fitting inside a rect, so pass (0, 0) for the origin 
let rect = CGRect(x: 0, y: 0, width: 900, height: 900) 

// aspect fitted size, in this case (900.0, 506.25) 
let final = AVMakeRectWithAspectRatioInsideRect(aspect, rect).size 

(함수는 스위프트 3 AVMakeRect(aspectRatio:insideRect:)로 변경되었음을 주목)

+0

로 변경 * 가져 오기 AVKit - 이것은 굉장합니다 – n13

+0

@ n13 [AVKit docs] (https://developer.apple.com/reference/avkit)에서만'AVMakeRect (aspectRatio : insideRect :)'가 보이지 않습니다. [AVFoundation의 기능] (https://developer.apple.com/reference/avfoundation/2009810-avfoundation_functions)의 일부로 – Hamish

+0

^네 말이 맞아. AVFoundation은 사용 중지 된 것처럼 삼진으로 표시되기 때문에 AVKit 가져 오기를 사용했습니다. 제거 된 AVKit 및 여전히 작동합니다. XCode 8/Swift 3. – n13

1

이 코드는 크게 감소되고 수정되지만 명확성을 위하여 수있다 : 스 니펫

if myImage.width == myImage.height { 
    // New image will be 900px by 900px 
    newImage.width = (900/myImage.width) * myImage.width 
    newImage.height = (900/myImage.height) * myImage.height 
} else if myImage.width > myImage.height { 
    // New image will have width of 900px 
    newImage.width = (900/myImage.width) * myImage.width 
    newImage.height = (900/myImage.width) * myImage.height 
} else { 
    // New Image will have height of 900px 
    newImage.width = (900/myImage.height) * myImage.width 
    newImage.height = (900/myImage.height) * myImage.height 
} 

, 900는 리사이즈 된 이미지의 최대 폭 및 높이이지만,이 값을 변수로 추상화 될 수있다 원하는 모든 가치에 대해.

+0

문제는 이미지 크기가 없어서'PHImageManagerMaximumSize'를 전달하고 있으므로 전체 이미지를 먼저 가져온 다음 필요한 크기를 가져 와서 다시 가져와야합니다. –

+0

우선, 질문에 진술해야합니다.둘째, 나는 네가 무슨 뜻인지 확신 할 수 없다. 처음에 이미지를 가져온 후에이 코드를 사용할 수 없습니까? –

+0

오, 죄송합니다. 나는 fetchImage (asset : size :)를 사용하므로 크기를 제공해야한다는 것을 의미한다. 귀하가 귀하의 의견에 적어 놓은 방법에서는 이미지의 전체 크기를 알아야합니다. 그래서 전체 크기의 이미지를 가져와 메소드를 호출하고 새로운'CGSize'를 얻은 다음 새로운 크기로 이미지를 다시 가져와야합니까? –

관련 문제